簡體   English   中英

asp.net 核心 AzureADJwtBearer 頒發者驗證失敗

[英]asp.net core AzureADJwtBearer issuer validation failure

我有庫存文件 | 新 | 網| asp.net core web api 項目模板,我選擇了 AzureAD 身份驗證,生成了以下 Startup.cs

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>"
  }

我正在使用郵遞員來利用公共客戶端配置文件應用程序設置獲取令牌,就像我為另一個 web api 設置所做的那樣,該設置按預期使用相同的 azureAd 承載令牌身份驗證代碼和設置坐標。

出於某種原因,這個應用程序試圖驗證錯誤的令牌發行者格式,我不知道如何糾正它。

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

如果您為 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);
}

我試圖在 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(String issuer, SecurityToken securityToken, TokenValidationParameters validationParameters)
在 System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateIssuer(String issuer, JwtSecurityToken jwtToken, TokenValidationParameters validationParameters)
在 System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateTokenPayload(JwtSecurityToken jwtToken, TokenValidationParameters validationParameters)
在 System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken(String token, TokenValidationParameters validationParameters, SecurityToken&validatedToken)
在 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:Information: Route 與 {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:Information: 使用身份驗證方案執行 ChallengeResult ()。 Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler:Information: AuthenticationScheme: AzureADB2CJwtBearer 受到質疑。 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: 在 8.105ms 內執行操作 Spolujizda.ApiServer.Controllers.ValuesController.Get (Spolujizda.ApiServer) Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: 請求在 8950.40133333ms 內完成/清楚的

但對我來說,修復要簡單得多。

對於 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.... 現在它可以工作了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM