【问题标题】:Consuming Id_token from Azure using UseWindowsAzureActiveDirectoryBearerAuthentication使用 UseWindowsAzureActiveDirectoryBearerAuthentication 从 Azure 使用 Id_token
【发布时间】:2018-11-13 04:56:03
【问题描述】:

需要任何人的帮助。

我有一个与 WebApi (.Net 4.52) 对话的 SPA 客户端应用程序。两者都是我公司开发的。它与 WebAPI 自己生成的令牌一起工作得很好(基于来自 bitoftech 的优秀文章)

我们现在希望允许使用 Azure 进行身份验证 - 更具体地说,是我客户自己的 azure 租户(我无法直接控制)。要在客户端执行此操作,我们使用 adal.js 来回执行实际登录用户的操作,并在服务器端使用 UseWindowsAzureActiveDirectoryBearerAuthentication 来验证 azure 令牌。

Oauth 启动看起来像这样:

public static void RunAcademyOAuthStartup(IAppBuilder app)
{            
        if (ConfigurationManager.AppSettings["ida:Enabled"] == "1")
        {
            app.UseWindowsAzureActiveDirectoryBearerAuthentication(
                new WindowsAzureActiveDirectoryBearerAuthenticationOptions
                {
                    TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters
                    {
                        ValidAudience = ConfigurationManager.AppSettings["ida:Audience"],
                        AuthenticationType = "ExternalAzureSSO"
                    },
                    Tenant = ConfigurationManager.AppSettings["ida:Tenant"]

                }
            );
        }


        var apiAccessTokenLifeTimeSeconds = 0;
        if (!int.TryParse(ConfigurationManager.AppSettings["ApiAccessTokenLifetimeSeconds"], out apiAccessTokenLifeTimeSeconds))
        {
            apiAccessTokenLifeTimeSeconds = 1800; //set default to 30 minutes
        }

        var oAuthServerOptions = new OAuthAuthorizationServerOptions()
        {
            AllowInsecureHttp = true,
            TokenEndpointPath = new PathString("/api/user/authenticate"),
            AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(apiAccessTokenLifeTimeSeconds),
            Provider = new SimpleAuthorizationServerProvider(),
            RefreshTokenProvider = new SimpleRefreshTokenProvider(),
            AuthenticationType = "LocalApplication"
        };

        OAuthBearerOptions = new OAuthBearerAuthenticationOptions();

        // Token Generation - setup the token authorization server
        app.UseOAuthAuthorizationServer(oAuthServerOptions);
        app.UseOAuthBearerAuthentication(OAuthBearerOptions);

}

上面的代码与我几天来一直在搜索的数百个其他示例没有什么不同。

当我使用免费的 Azure 实例(通过我公司的 MSDN)时,这一切正常 - 我可以进行身份​​验证,令牌从 azure 返回,webapi 可以对其进行解码和验证,然后继续。

当我对客户的 P1 Azure 实例尝试此操作时,我的问题出现了 - 我可以进行身份​​验证,取回令牌,但我的 webapi 没有解码令牌。据我所知,没有记录任何错误。

目前我可以看到的主要内容是,当我获得 azure 令牌并使用 jwt.io 对其进行解码时,我可以看到“x5t”和“kid”值。根据我在网上找到的其他信息,我应该能够从https://login.microsoftonline.com/common/discovery/keys 获取最新的密钥,并在那里找到“x5t”和/或“kid”值......但我可以'吨。

这可能吗?什么会导致使用非通用密钥生成令牌?这是天蓝色应用注册中的配置项吗?我是否需要在 Web api 中的 UseWindowsAzureActiveDirectoryBearerAuthentication 配置中添加更多设置?

代币都是 v1

【问题讨论】:

  • 你的ida:Tenant 值是多少?
  • 另外,您不应使用 Id 令牌对 API 进行身份验证,而应使用访问令牌。这需要您在 Azure AD 中注册两个应用程序,一个用于前端的 Native,一个用于 API 的 Web 应用程序/API。然后前端应获取访问令牌以调用 API。
  • 另一个问题是你想支持任何 Azure AD 还是只支持一个?
  • 您好 Juunas,我不确定我能否告诉您租户价值是什么 - 我认为我的客户不希望在公共论坛上直接发布(即使它是公共信息)。在 Azure 中注册 WebAPI 时,我已经阅读了相关内容,但我有两件事: 1. Id 令牌和访问令牌非常相似,我在 webapi 中有一些自定义代码,用于验证 id 令牌中的声明。 2. 整个过程对我的免费 azure 广告很有效,无需注册 api。我的应用程序的每个实例都只能与一个 azure 租户一起使用。
  • 是的,你不需要说租户值,我只想知道它是common还是租户ID。由于您已将其设置为客户租户 ID,因此它应该在启动时从您提到的 URL 加载签名密钥。所有租户都应使用相同的签名密钥,除非他们使用例如德国/中国 Azure 云。

标签: c# asp.net azure authentication


【解决方案1】:

为将来遇到此线程的任何人提供答案...可能是新手错误:)

在我的案例中,我发现 Azure 端的管理员在编辑“应用程序注册”区域中的清单等之前,已使用其 Azure 门户中的“企业应用程序”选项注册了我的应用程序。根据微软支持,它应该以相反的方式完成 - 首先在应用程序注册中注册,然后转到企业应用程序(如果需要)。按此顺序执行操作意味着 azure 租户随后会生成令牌并使用“通用”密钥对它们进行签名,而不是企业应用程序获取的自定义密钥。

【讨论】:

    猜你喜欢
    • 2020-06-27
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 2018-08-25
    • 2019-01-30
    • 1970-01-01
    • 2021-04-04
    相关资源
    最近更新 更多