在 Web 上验证 Azure AD 令牌时出现问题 API

Problem with authenticating Azure AD tokens at Web API

我有 2 个 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)不是 "the same",因此未获得授权。

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

谢谢

将对令牌进行 3 位验证

1) 它将验证它是否由开放 ID 提供商的 public 密钥签名(例如从此处检索 https://login.microsoftonline.com/common/discovery/keys

2) 它将验证令牌的发行者(iss 声明)对 API

有效

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

有效

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

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

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

如果这两个令牌是同一发行者并且您很高兴 'Site B' 接受来自 'Site A' 的令牌,那么您可以修改令牌验证参数以在此处接受多个选项,看看这个例子的答案

调查令牌中的声明,然后修改站点 B 的配置以相应地验证声明,方法是允许 audiences/issuers 您希望能够与之通信。