在.NET Core Web API中配置Microsoft.Identity.Web的OnTokenValidated事件未触发问题
问题分析与解决方案
你的配置存在两个核心问题,导致OnTokenValidated事件无法触发:
1. 错误的认证方案选择
Web API场景下,Azure AD B2C的认证依赖JWT Bearer令牌验证,但你代码中使用了OpenIdConnectDefaults.AuthenticationScheme——这个方案是为交互式应用(如MVC、Razor Pages)设计的,用于处理用户登录/注销的完整流程,并不适用于纯API场景。
2. 错误的事件覆盖方式
直接通过options.Events = new JwtBearerEvents()覆盖默认事件会清空Microsoft.Identity.Web预设的令牌验证逻辑,可能导致整个认证流程异常。
修正后的配置代码
using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.Identity.Web; // ... services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(options => { configuration.Bind("Authentication:AzureADB2C", options); options.TokenValidationParameters.NameClaimType = "name"; // 直接添加事件委托,保留默认逻辑的同时注入自定义代码 options.Events.OnTokenValidated += async context => { // 你的自定义逻辑,比如获取用户声明、存储用户信息等 await Task.CompletedTask; }; options.Events.OnAuthenticationFailed += context => { // 自定义认证失败处理逻辑 return Task.CompletedTask; }; });
优化后的appsettings.json配置
Web API不需要SignedOutCallbackPath(该配置用于交互式应用的注销跳转),可以移除:
"Authentication": { "AzureADB2C": { "TenantId": "", "Instance": "https://<你的租户名>.b2clogin.com", "ClientId": "", "Domain": "<你的租户名>.onmicrosoft.com", "SignUpSignInPolicyId": "B2C_1A_signup_signin" } }
额外验证要点
- 确保Azure AD B2C中注册的API应用已配置正确的范围,且客户端应用请求令牌时包含了该范围。
- 调用API时,请求头必须携带有效的Bearer令牌,格式为:
Authorization: Bearer <你的JWT令牌>
内容的提问来源于stack exchange,提问作者Avdesh Gupta
相关产品推荐
相关产品推荐

