如何在 .Core 应用程序中使用授权验证 Azure B2C 访问令牌

Posted

技术标签:

【中文标题】如何在 .Core 应用程序中使用授权验证 Azure B2C 访问令牌【英文标题】:How to validate Azure B2C access token using Authorization in .Core application 【发布时间】:2021-09-12 13:49:12 【问题描述】:

我能够使用以下代码成功验证控制器内部 Azure AD B2C 颁发的访问令牌:

string discoveryEndpoint = "https://<tenant>.b2clogin.com/<tenant>.onmicrosoft.com/<policyId>/v2.0/.well-known/openid-configuration";
ConfigurationManager<OpenIdConnectConfiguration> configManager = new(discoveryEndpoint, new OpenIdConnectConfigurationRetriever());
OpenIdConnectConfiguration openIdconfig = configManager.GetConfigurationAsync().Result;
TokenValidationParameters validationParameters = new()

    ValidateAudience = true,
    ValidAudience = <ClientId>,
    ValidateIssuer = true,
    ValidIssuer = openIdconfig.Issuer,
    IssuerSigningKeys = openIdconfig.SigningKeys,
    ValidateLifetime = true
;
JwtSecurityTokenHandler tokenHandler = new();
tokenHandler.ValidateToken(accessToken, validationParameters, out SecurityToken validatedToken);

但不能像这样在 Startup.cs 中设置授权

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
   .AddJwtBearer(cfg =>
   
       <...the same code as above to get issuer and signing keys...>
       cfg.TokenValidationParameters = new()
       
          ValidateAudience = true,
          ValidAudience = <ClientId>,
          ValidateIssuer = true,
          ValidIssuer = openIdconfig.Issuer,
          IssuerSigningKeys = openIdconfig.SigningKeys,
          ValidateLifetime = true
       ;
   );
<...>
public void Configure(IApplicationBuilder appBuilder)

   <...>
   appBuilder.UseRouting();
   appBuilder.UseAuthorization();
   <...>

并在我的控制器方法中使用 [Authorize] 属性。在这种情况下,我得到 401 响应。我在这里做错了什么?

【问题讨论】:

【参考方案1】:

我会给你一个小费。 在 AddJwtBearer 选项中注册事件

           .AddJwtBearer("JwtBearer", opts =>
           
               opts.Authority = GetAuthority(configuration);
               opts.Audience = configuration["Authentication:AzureAdB2C:ClientId"];
               opts.TokenValidationParameters = new TokenValidationParameters()
               
                   ValidateIssuer = true,
                   ValidIssuer = configuration["Authentication:AzureAdB2C:Issuer"],
                   ValidAudiences = new string[]  opts.Audience ,
                   ValidateLifetime = true,
                   NameClaimType = "name",
               ;

               opts.Events = new JwtBearerEvents();

               opts.Events.OnAuthenticationFailed = authFailedContext =>
               
                   return Task.CompletedTask;
               ;
               opts.Events.OnMessageReceived = messageContext =>
               
                   return Task.CompletedTask;
               ;
               opts.Events.OnTokenValidated = tokenValidatedContext =>
               
                   return Task.CompletedTask;
               ;
               opts.Events.OnForbidden = forbiddenContext =>
               
                   return Task.CompletedTask;
               ;
           );

并检查/记录天蓝色验证上下文。

【讨论】:

以上是关于如何在 .Core 应用程序中使用授权验证 Azure B2C 访问令牌的主要内容,如果未能解决你的问题,请参考以下文章

OpenID Connect Core 1.0使用授权码流验证(上)

使用 ASP.NET Core 后端和 React 前端的 Web 应用程序中的授权和身份验证?

.Net Core 2.1 WepAPI 中使用 JWT 的身份验证和授权

在 asp.net core 3.1+ 中使用多个中间件进行身份验证和授权

.Net Core 权限验证与授权(AuthorizeFilterActionFilterAttribute)

.NET Core - 在 IIS 上使用 Windows 身份验证从 MVC 应用程序调用 Web API 导致 HttpRequestException 401(未经授权)状态代码