2

我有 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 才能使其正常工作?

谢谢

4

1 回答 1

1

将针对令牌进行 3 位验证

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

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

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

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

您发送到 API 的令牌很可能未通过颁发者或受众验证。使用 JWT 解码器(如http://jwt.ms/)检查令牌并了解发送到 API 的声明。

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

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

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

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

于 2019-07-03T15:55:43.017 回答