【问题标题】:Common authentication between two ASP.NET apps based on ASP.NET Identity基于 ASP.NET Identity 的两个 ASP.NET 应用程序之间的通用身份验证
【发布时间】:2014-05-26 15:14:20
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: asp.net asp.net-web-api asp.net-identity owin asp.net-identity-2


    【解决方案1】:

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

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

    【讨论】:

    • 我在问题中添加了一些信息
    【解决方案2】:

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

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

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

    【讨论】:

    • 即使它们在同一个网络服务器上,我虽然 OWIN 中间件可以工作,但它没有。您是否建议创建另一个应用程序,仅用于身份验证?
    • 是的,这就是我的建议,但它似乎适用于 WebAPI_1 ......对吗?如果您回答我提出的问题,我可以给出更好的建议,并理解为什么它不起作用。
    • 是的,它适用于 WebAPI_1。 /Token 端点在每个 API 中——就像在标准 VS2013 模板中一样。假设 WebAPI_1 与用户对话,而 WebAPI_2 与服务通信——在这些服务中,我也想以用户身份登录,代表用户执行一些操作。
    • 听起来令牌需要在其中包含一些用户信息,以便您可以跟踪用户对 WebAPI_2 的操作。例如客户端登录并使用用户声明获取令牌,创建会话,并可以使用该令牌对 WebAPI_2 执行操作
    【解决方案3】:

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

    在您的 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")
    });
    

    那么神奇的是,您的控制器将拥有一个经过身份验证的用户。

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

    【讨论】:

      猜你喜欢
      • 2017-12-06
      • 1970-01-01
      • 2018-01-28
      • 2020-03-04
      • 2017-10-29
      • 2019-02-25
      • 1970-01-01
      • 2023-04-08
      • 2014-11-27
      相关资源
      最近更新 更多