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
相关产品推荐
相关产品推荐

