.NET Core Azure AD登录时OnAuthorizationCodeReceived事件未触发求助
我来帮你梳理下这个问题的常见排查方向,结合你给出的配置片段,咱们一步步来:
先确认事件处理程序是否正确注册
你贴的配置代码里没看到事件绑定的部分,要记得把OnAuthorizationCodeReceived事件处理程序赋值给OpenIdConnectOptions的Events属性,比如:options.Events = new OpenIdConnectEvents { OnAuthorizationCodeReceived = context => { // 你的事件逻辑代码 return Task.CompletedTask; } };如果没加这段,事件肯定不会被触发哦。
检查CallbackPath和Azure AD应用注册的重定向URI是否完全匹配
你代码里options.CallbackPath没写完,一定要确保这个路径和Azure AD应用注册后台里的重定向URI完全一致——包括协议(http/https)、端口号、完整路径。比如你本地测试用https://localhost:5001/signin-oidc,那Azure AD里也要填一模一样的,路径不匹配的话,Azure AD不会回调到你的应用,自然收不到授权码。验证UseTokenLifetime设置是否导致跳过授权流程
你设置了options.UseTokenLifetime = true,这个会让应用使用Azure AD返回的令牌生命周期。如果之前已经有有效的会话Cookie,应用可能会直接复用现有会话,跳过授权码流程,导致事件不触发。建议你清除浏览器缓存和Cookie,或者用隐身窗口重新测试,看看事件会不会触发。确认中间件注册顺序是否正确
在Startup的Configure方法里,必须保证app.UseAuthentication()在app.UseAuthorization()之前,而且OpenID Connect中间件要正确添加到Authentication服务中(比如services.AddAuthentication().AddOpenIdConnect("AzureAD", options => { ... }))。中间件顺序错了的话,事件可能无法被正确捕获。检查Azure AD应用的流配置是否正确
要确保Azure AD应用注册的“身份验证”设置里,启用了授权码流(Authorization Code Flow)。如果误开了隐式流(Implicit Flow),Azure AD不会返回授权码,自然不会触发OnAuthorizationCodeReceived事件。启用详细日志定位问题
可以在appsettings.json里添加详细的日志配置,排查授权流程中的细节:"Logging": { "LogLevel": { "Microsoft.AspNetCore.Authentication": "Debug", "Microsoft.AspNetCore.Authentication.OpenIdConnect": "Debug" } }然后查看应用日志,看看有没有授权流程中的错误提示,或者跳过授权码步骤的信息,这能帮你精准定位问题。
内容的提问来源于stack exchange,提问作者SmartestVEGA

