【问题标题】:asp.net core AzureADJwtBearer issuer validation failureasp.net 核心 AzureADJwtBearer 颁发者验证失败
【发布时间】:2019-05-26 18:37:38
【问题描述】:

我有库存文件 |新 |网站 |我选择了生成以下 Startup.cs 的 AzureAD 身份验证的 asp.net 核心 Web api 项目模板

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
        .AddAzureADBearer(options => Configuration.Bind("AzureAd", options));
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

以及下面的 appsettings.json

"AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "mymsdn.onmicrosoft.com",
    "TenantId": "<my azuread tenant id>",
    "ClientId": "<my azuread web app id>"
  }

我正在使用邮递员获取令牌,利用公共客户端配置文件应用设置,就像我为另一个使用相同 azureAd 不记名令牌身份验证代码和设置坐标按预期工作的 Web api 设置所做的那样。

由于某种原因,这个应用程序正在尝试验证错误的令牌颁发者格式,我不知道如何更正它。

Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler:Information: AzureADJwtBearer was not authenticated. Failure message: IDX10205: Issuer validation failed. Issuer: 'https://login.microsoftonline.com/&lt;my azuread tenantid&gt;/v2.0'. Did not match: validationParameters.ValidIssuer: 'null' or validationParameters.ValidIssuers: 'https://sts.windows.net/&lt;my azuread tenantid&gt;/'.

【问题讨论】:

    标签: c# azure-active-directory asp.net-core-webapi


    【解决方案1】:

    我试图在 web-api 中验证来自 uwp-app 的现有令牌,但我遇到了类似的问题:

    Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler:信息:无法验证令牌。

    Microsoft.IdentityModel.Tokens.SecurityTokenInvalidIssuerException:IDX10205:颁发者验证失败。发行人:'https://spolujizda.b2clogin.com/4e8094c9-5058-454c-b201-ef61d7ae6619/v2.0/'。不匹配:validationParameters.ValidIssuer: 'null' 或 validationParameters.ValidIssuers: 'https://login.microsoftonline.com/4e8094c9-5058-454c-b201-ef61d7ae6619/v2.0/'。

    在 Microsoft.IdentityModel.Tokens.Validators.ValidateIssuer(字符串颁发者、SecurityToken securityToken、TokenValidationParameters 验证参数)
    在 System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateIssuer(字符串颁发者,JwtSecurityToken jwtToken,TokenValidationParameters 验证参数)
    在 System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateTokenPayload(JwtSecurityToken jwtToken, TokenValidationParameters 验证参数)
    在 System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken(字符串令牌,TokenValidationParameters 验证参数,SecurityToken 和验证令牌)
    在 Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync()
    Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler:信息:AzureADB2CJwtBearer 未通过身份验证。失败消息:IDX10205:颁发者验证失败。发行人:'https://spolujizda.b2clogin.com/4e8094c9-5058-454c-b201-ef61d7ae6619/v2.0/'。不匹配:validationParameters.ValidIssuer:'null' 或 validationParameters.ValidIssuers:'https://login.microsoftonline.com/4e8094c9-5058-454c-b201-ef61d7ae6619/v2.0/'。 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:信息:路由与 {action = "Get", controller = "Values"} 匹配。执行动作 Spolujizda.ApiServer.Controllers.ValuesController.Get (Spolujizda.ApiServer) Microsoft.AspNetCore.Authorization.DefaultAuthorizationService:信息:授权失败。 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:信息:过滤器“Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter”处的请求授权失败。 Microsoft.AspNetCore.Mvc.ChallengeResult:信息:使用身份验证方案执行 ChallengeResult ()。 Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler:信息:AuthenticationScheme:AzureADB2CJwtBearer 受到挑战。 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:信息:在 8.105 毫秒内执行操作 Spolujizda.ApiServer.Controllers.ValuesController.Get (Spolujizda.ApiServer) Microsoft.AspNetCore.Hosting.Internal.WebHost:信息:请求在 8950.4739ms 401 文本/纯文本中完成

    但对我来说,修复要简单得多。

    对于 Web API,我将 AzureAdB2C.Instance 设置为 https://spolujizda.b2clogin.com/tfp/

    对于 UWP 应用,我一直通过 https://login.microsoftonline.com/tfp/ 发行令牌

    这就是导致此错误的原因。因为在 UWP 应用程序中,令牌是为 login.microsoft... 颁发的,而在 Web API 中,它试图将颁发者验证为 spolujizda.b2clogin...

    首先我尝试更改为 uwp-app 颁发令牌的地址,但没有成功。

    其次,我只是将 web-api 的 AzureAdB2C.Instance 配置更改为 login.microsoft.... 现在它可以工作了。

    【讨论】:

    • 我记得在最初的测试中只是更改了我的 appsettings.json | "AzureAd" : { "Instance": "https://login.microsoftonline.com/" -&gt; "https://sts.windows.net/", . . . } 但这导致了失败,并且它试图验证 https://sts.windows.net/&lt;my azuread tenantid&gt;/v2.0 而不是没有 /v2.0 后缀。
    【解决方案2】:

    如果您为 ClientId 配置了 azuread 应用程序注册条目以支持任何组织或消费者(也称为 microsoft 帐户)登录,而不仅仅是您的组织或任何组织,则会出现此问题。解决方法是使用下面显示的 Startup.ConfigureServices() 代码的 AddJwtBearer() 块,而不是提供的项目模板 AddAzureADBearer() 块。

    public void ConfigureServices(IServiceCollection services)
    {
        // if azuread app registrations entry for ClientId has "signInAudience": "AzureADMyOrg" or "AzureADMultipleOrgs" where "iss": "https://sts.windows.net/{TenantId}/"
        services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
            .AddAzureADBearer(options => //Configuration.Bind("AzureAd", options));
            {
                Configuration.Bind("AzureAd", options);
                Log.LogInformation($"the AddAzureADBearer options have been configured for ClientId = {options.ClientId}");
            });
    
        // if azuread app registrations entry for ClientId has "signInAudience": "AzureADandPersonalMicrosoftAccount" where "iss": "https://login.microsoftonline.com/{TenantId}/v2.0"
        services.AddAuthentication(options => { options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; })
            .AddJwtBearer(options =>
            {
                var azureadoptions = new AzureADOptions(); Configuration.Bind("AzureAd", azureadoptions);
                options.Authority = $"{azureadoptions.Instance}{azureadoptions.TenantId}/v2";
                options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
                {
                    ValidAudience = $"{azureadoptions.ClientId}",
                    //ValidAudiences = new List<string> { $"{azureadoptions.ClientId}", $"api://{azureadoptions.ClientId}", $"https://myapp.azurewebsites.net/" },
                    //ValidIssuer = $"https://sts.windows.net/{azureadoptions.TenantId}/" // for "signInAudience": "AzureADMyOrg" or "AzureADMultipleOrgs"
                    ValidIssuer = $"{azureadoptions.Instance}{azureadoptions.TenantId}/v2.0" // for "signInAudience": "AzureADandPersonalMicrosoftAccount"
                    //ValidIssuers = new List<string> { $"https://sts.windows.net/{azureadoptions.TenantId}/", $"{azureadoptions.Instance}{azureadoptions.TenantId}/v2.0" }                        
                };
    
                Log.LogInformation($"the AddJwtBearer options have been configured for ClientId = {azureadoptions.ClientId}");
            });
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }
    

    【讨论】:

    • 在哪里可以阅读有关您回答的文档? AddAzureADBearer 对我来说是新的。
    • 我会查看 AddAzureADBearer 搜索结果,例如AzureADAuthenticationBuilderExtensions.AddAzureADBearer Method 对于初学者。我的经验是它需要混合官方文档、入门演练和 TrialNerror 与这些东西,因为它正在迅速发展。也许在这一点上它已经稳定下来,所以坚持过去一年的文档会产生最好的结果。
    猜你喜欢
    • 1970-01-01
    • 2021-06-18
    • 2011-03-10
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多