【问题标题】:Problem with authenticating Azure AD tokens at Web API在 Web API 上验证 Azure AD 令牌的问题
【发布时间】:2019-11-14 03:58:17
【问题描述】:

我有 2 个网络应用程序。

  • 站点 A 既是前端 (Angular),又是用 .NET 核心编写的 Web API。
  • 站点 B 是用 .NET 核心编写的 Web API。

两个站点中的 Web API 相同。认证是一样的。


测试 1:当我要求站点 A 使用其自己的 API 来获取数据(启用站点 A 的身份验证)时,效果很好。

测试 2:当我要求站点 A 使用站点 B 获取数据时(站点 B 的身份验证已关闭),效果很好。

测试 3:当我要求站点 A 使用站点 B 获取数据(站点 B 的身份验证已打开)时,它失败并出现未经授权的错误 401。

这是我用来验证的代码...

services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(o =>
{
    o.MetadataAddress = String.Format("https://login.microsoftonline.com/{0}/v2.0/.well-known/openid-configuration", Configuration["AzureAd:TenantId"]);
    o.Audience = Configuration["AzureAd:ClientId"];
});

所以...

我知道令牌正确通过(因为测试 A)。

我知道被调用的站点 B API 是可访问且正确的(因为测试 B)。

因此,我认为问题在于传递给 Azure AD 的值。我假设 Azure 不认为在站点 A 中获取并在站点 B 中验证的令牌(具有不同的 URI)不是“相同的”,因此未获得授权。

我需要将什么传递给 Azure 才能使其工作?

谢谢

【问题讨论】:

    标签: angular asp.net-core jwt azure-active-directory msal.js


    【解决方案1】:

    将针对令牌进行 3 位验证

    1) 它将验证它是否由开放 id 提供者的公钥签名(例如,从这里检索到 https://login.microsoftonline.com/common/discovery/keys

    2) 它将验证令牌的颁发者(iss 声明)是否对 API 有效

    3) 它将验证令牌的受众(aud 声明)对 API 有效

    (还有一些额外的生命周期验证,但这三个在配置时很重要)

    您发送给 API 的令牌很可能没有通过 issueraudience 验证。使用像 http://jwt.ms/ 这样的 JWT 解码器来检查令牌并了解发送到 API 的声明。

    您的令牌的 aud 声明是否与您在 Configuration["AzureAd:ClientId"] 中指定的受众相匹配?

    如果两个令牌的发行者相同,并且您很高兴“站点 B”接受来自“站点 A”的令牌,那么您可以在此处修改令牌验证参数以接受多个选项,请查看此答案以获取例子

    https://stackoverflow.com/a/47072385/1538039

    调查令牌中的声明,然后修改站点 B 的配置以相应地验证声明,允许您希望能够与之通信的受众/发布者。

    【讨论】:

    • 感谢您提供非常清晰的反馈。我将对此进行调查并报告。此外,JWT 解码器将非常有用。
    • 所以,我检查了站点 A 生成的 JWT 令牌,看起来 iss 和 aud 值是正确的(与站点 B 相同)正在比较。
    • 是否可以获得有关身份验证失败的原因的一些信息?事件日志只是说身份验证失败。不是最有用的调试见解。
    • 如果我调试两个 API 请求,站点 A 有一个填充的 ClaimsIdentity,站点 B 没有。这似乎根本不是 Azure 令牌声明值的问题。嗯。我现在会接受你的回答(因为它回答了我最初的假设)。
    • 如果令牌验证参数失败,您将不会拥有 ClaimsIdentity。查看 OnAuthenticationFailed 事件,您可以像 stackoverflow.com/a/48890853/1538039 那样连接它。在进行令牌验证后,传递给该方法的上下文应该具有异常详细信息(根据 github.com/aspnet/Security/blob/…)。
    猜你喜欢
    • 1970-01-01
    • 2019-10-14
    • 2020-01-12
    • 2020-03-09
    • 1970-01-01
    • 2019-12-31
    • 2017-02-17
    • 2019-08-10
    • 2021-12-13
    相关资源
    最近更新 更多