在 Web 上验证 Azure AD 令牌时出现问题 API
Problem with authenticating Azure AD tokens at Web API
我有 2 个 Web 应用程序。
- 站点 A 既是前端 (Angular) 又是用 .NET 核心编写的 Web API。
- 站点 B 是一个用 .NET 核心编写的 API 网站。
两个网站的网页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 的令牌很可能没有通过 issuer 或 audience 验证。使用像 http://jwt.ms/ 这样的 JWT 解码器来检查令牌并理解发送到 API 的声明。
您的令牌的 aud 声明是否与您在配置中指定的受众匹配["AzureAd:ClientId"]?
如果这两个令牌是同一发行者并且您很高兴 'Site B' 接受来自 'Site A' 的令牌,那么您可以修改令牌验证参数以在此处接受多个选项,看看这个例子的答案
调查令牌中的声明,然后修改站点 B 的配置以相应地验证声明,方法是允许 audiences/issuers 您希望能够与之通信。
我有 2 个 Web 应用程序。
- 站点 A 既是前端 (Angular) 又是用 .NET 核心编写的 Web API。
- 站点 B 是一个用 .NET 核心编写的 API 网站。
两个网站的网页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 的令牌很可能没有通过 issuer 或 audience 验证。使用像 http://jwt.ms/ 这样的 JWT 解码器来检查令牌并理解发送到 API 的声明。
您的令牌的 aud 声明是否与您在配置中指定的受众匹配["AzureAd:ClientId"]?
如果这两个令牌是同一发行者并且您很高兴 'Site B' 接受来自 'Site A' 的令牌,那么您可以修改令牌验证参数以在此处接受多个选项,看看这个例子的答案
调查令牌中的声明,然后修改站点 B 的配置以相应地验证声明,方法是允许 audiences/issuers 您希望能够与之通信。