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

ASP.NET双认证配置后,如何捕获OpenIdConnect令牌接收事件?

解决OpenIdConnect令牌接收时触发事件的问题

首先需要修正你现有代码中的认证配置问题:两次调用AddAuthentication会覆盖默认的认证方案,导致其中一种认证方式无法正常工作。正确的配置方式是先初始化认证服务,再依次添加OpenIdConnect(用于MVC)和JwtBearer(用于Web API)两种认证方式:

using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.Identity.Web;

// 先初始化认证,设置默认方案(OpenIdConnect依赖Cookie保存身份)
builder.Services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
// 添加MVC用的OpenIdConnect认证,并配置令牌接收事件
.AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"), options =>
{
    // 配置令牌接收时的自定义逻辑
    options.Events.OnTokenReceived = context =>
    {
        // 这里编写令牌接收后的处理代码
        // 示例:获取收到的令牌内容
        var receivedToken = context.Token;
        
        // 可执行的操作:解析令牌声明、存储令牌到数据库、添加自定义用户声明等
        // 如果需要中断认证流程,可调用context.HandleResponse()
        
        return Task.CompletedTask;
    };

    // 可选:配置其他相关事件,比如授权码接收事件
    options.Events.OnAuthorizationCodeReceived = context =>
    {
        // 授权码接收后的处理逻辑
        return Task.CompletedTask;
    };
})
// 添加Web API用的JwtBearer认证
.AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"));

builder.Services.AddControllersWithViews().AddMicrosoftIdentityUI();

关键事件说明

  • OnTokenReceived事件:在OpenIdConnect中间件成功接收令牌(id_token/access_token)时触发,是处理令牌相关自定义逻辑的核心入口,比如解析令牌内容、持久化令牌、补充用户声明等。
  • 其他常用事件:OnUserInformationReceived(获取到用户信息时触发)、OnAuthenticationFailed(认证失败时触发),可根据业务需求灵活配置。

请求管道修正

确保认证中间件的调用顺序正确,必须先执行认证再执行授权:

var app = builder.Build();

// ... 其他管道配置(异常处理、HTTPS重定向等)

app.UseRouting();

// 注意顺序:先认证,后授权
app.UseAuthentication();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

按控制器指定认证方式

如果需要为MVC和Web API控制器分别指定认证方案,可在控制器上添加特性声明:

// MVC控制器使用OpenIdConnect认证
[Authorize(AuthenticationSchemes = OpenIdConnectDefaults.AuthenticationScheme)]
public class HomeController : Controller
{
    // ...
}

// Web API控制器使用JwtBearer认证
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
[ApiController]
[Route("api/[controller]")]
public class ApiController : ControllerBase
{
    // ...
}

内容的提问来源于stack exchange,提问作者Akhil Tyagi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 07:53:24