【问题标题】:Azure AD Identity authentication error : IDX10214: Audience validation failedAzure AD 身份验证错误:IDX10214:观众验证失败
【发布时间】:2021-11-28 14:28:51
【问题描述】:

我有一个想要使用 Azure AD 保护的 .net core 5 api,然后从控制台应用程序调用它。所以我的案例只是服务到服务的身份验证。我将这两个应用程序都注册到了 Azure AD,然后使用应用程序角色授予了 api 上的控制台应用程序的权限。 我成功地为控制台应用程序检索了一个令牌,通过了正确的范围:

static async Task Main(string[] args)
{
     var app = ConfidentialClientApplicationBuilder
                .Create(<MY_CONSOLE_APP_ID>)
                .WithClientSecret(<MY_CONSOLE_APP_CLIENT_SECRET>)
                .WithAuthority(new Uri($"https://login.microsoftonline.com/<MY_TENANT_ID>"))
                .Build();
            
            
      var result = await app.AcquireTokenForClient(new String[]
                {
                    "api://<MY_API_APP_ID>/.default"
                })
                .ExecuteAsync();
}

然后在 API 的 Startup 类中,我添加了以下代码:

services
    .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration, "AzureAd");

我在 appsettings.json 中定义了所需的设置:

"AzureAd": {
    "ClientId": "<MY_API_APP_ID>",
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "<MY_TENANT_ID>"
}

然后我将控制器标记为 [Authorize],但是当我调用其端点之一时,我收到以下错误:

{
    "code": 401,
    "message": "IDX10214: Audience validation failed. Audiences: '[PII is hidden]'. Did not match: validationParameters.ValidAudience: '[PII is hidden]' or validationParameters.ValidAudiences: '[PII is hidden]'."
}

我也尝试用 api:// 作为 clientId 的前缀,但得到了同样的错误。我对令牌进行了解码以确保观众是正确的,而且看起来没问题,因为我有 "aud": "api://"

你知道我错过了什么吗?

【问题讨论】:

    标签: azure azure-active-directory azure-ad-graph-api azure-authentication


    【解决方案1】:

    提供的任何代码看起来都不错。 确保受众配置与访问令牌中的“aud”声明相匹配。 由于此处未提供该部分代码, 您可能在 services.AddAuthentication(... 请检查您是否以任何这些方式提供了观众输入。

    1

    .AddJwtBearer(options =>
             {
                  options.Authority = "";
              //options.Audience = Configuration["Audience"];
    
    };
    

    (或) 2

    .AddJwtBearer(options =>
                {
                    options.Audience = clientId;
                    options.Authority = authority;
                })
    

    (或) 3)

     .AddJwtBearer(options =>
                         {
                            options.Authority = "";
                            options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
            {
        //here you give required valid audiences
        
                ValidateIssuer = true,
                ValidAudiences = new List<string> 
                {
                    "AUDIENCE1",
                    "AUDIENCE2" 
    
                }
    

    或有效的受众可以如下所示代替 AUDIENCE1 或 2。

            ValidAudiences = new List<string> 
            {
              Configuration["Authentication:ClientId"]
            }
    

    aud(观众)应该与您的 API 的 ID 相匹配,并确保存在所需的范围。如果这些都很好,然后检查您要验证的令牌是 ID 令牌还是访问令牌。它因 API 和图形而异接口。

    【讨论】:

      猜你喜欢
      • 2019-03-21
      • 2018-06-19
      • 2020-04-22
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多