You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:25:14