4

我的解决方案中有几个应用程序,我想在它们之间共享身份验证。为了简化,假设我有两个 WebAPI 应用程序。我使用/Token端点进行身份验证,并接收承载令牌作为回报。之后,我把这个令牌放在Authentication:标题中。

现在,登录到 WebAPI_1 我可以从[Authorize]-decorated 方法中获取数据。但如果我想在 WebAPI_2 中这样做,那是行不通的。

这些 WebAPI 是开箱即用的 VS2013 WebAPI 2.1 模板,带有 ASP.NET Identity 2。每个模板都是单独设置的,但它们连接到同一个数据库。

我应该如何解决这个问题?

我计划实现 LoadBalanced 架构,其中客户端应用程序 (AngularJS) 与 WebAPI 通信。现在我应该能够复制 WebAPI,因此用户应该通过所有这些进行身份验证。

4

3 回答 3

0

您不必担心授权属性,它只是确保有一个身份。

在您的 startup.cs 中,您应该将 api 配置为使用不记名令牌。

生成令牌的客户端和所有 Web api 服务器都必须使用相同的 AccesstokenFormat。ISecureDataFormat<AuthenticationTicket> 否则他们无法读取您传递给它的令牌。请记住,解密令牌并不总是意味着您可以信任它,建议对它们进行签名和验证,但这有点超出了身份 2.0 的范围

webapi 中的 Startup.cs

app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
{
                      //you can write your encryption however you want.
                      // just implement ISecureDataFormat<AuthenticationTicket>
              AccessTokenFormat = new SecureTokenFormatter("YourKeyIfThatsHowYouDesignIt")
});

然后魔术,您的控制器将有一个经过身份验证的用户。

** 编辑 ** 我在堆栈上看到了几个不同的格式化程序示例,谷歌一下。

于 2014-05-05T20:50:09.060 回答
0

-Attribute[Authorize]仅检查当前主体是否经过身份验证。

WebAPI 是如何设置的?确保您的身份验证中间件始终在 WebAPI 中间件之前运行。这很可能是您的问题。

于 2014-04-12T12:46:34.477 回答
0

如果 WebAPI_1、WebAPI_2 等都针对同一个数据库进行操作,为什么要将它们托管在不同的 Web 服务器上?如果您只有一个 WebAPI Web 服务器,那么应​​用一致的身份验证中间件会容易得多。

如果你有一个负载平衡的架构,你应该能够添加更多这个 WebAPI 服务器的实例来处理请求负载需求。

否则,如果需要 WebAPI_1、WebAPI_2 作为单独的 Web 服务器存在,您将需要实现 /Token 端点,以便所有 Web 服务器都可以获取令牌,可能在单独的 Web 服务器 WebAPI_Token 上。/Token 端点当前在哪里?

于 2014-04-14T18:08:51.203 回答