ASP.NET Core 6 MVC集成Azure AD认证回调路径失败问题求助
我在ASP.NET Core 6 MVC应用中,通过Microsoft.Identity.Web实现Azure Active Directory用户认证流程,可正常打开登录页并完成登录,但CallbackPath回调环节失败。以下是相关代码配置与错误情况:
相关配置与代码
Startup.cs 代码片段
foreach (var conn in azureADTenants) { services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(options => { options.Instance = conn.ActiveDirectorySettings.Instance; options.Domain = conn.ActiveDirectorySettings.Domain; options.TenantId = conn.ActiveDirectorySettings.TenantId; options.ClientId = conn.ActiveDirectorySettings.ClientId; options.ClientSecret = conn.ActiveDirectorySettings.ClientSecret; options.CallbackPath = conn.ActiveDirectorySettings.CallbackPath; options.SignedOutCallbackPath = conn.ActiveDirectorySettings.SignedOutCallbackPath; }); services.Configure<OpenIdConnectOptions>(conn.Name, options => { var existingOnTokenValidatedHandler = options.Events.OnTokenValidated; options.Events.OnTokenValidated = async context => { await existingOnTokenValidatedHandler(context); await context.HttpContext.SignInAsync( CookieAuthenticationDefaults.AuthenticationScheme, context.Principal); }; }); }
appSettings.json 配置片段
"ActiveDirectorySettings": { "Instance": "https://login.microsoftonline.com/", "Domain": "aaahotmail.onmicrosoft.com", "TenantId": "xxxxxxxx-xxx...", "ClientId": "xxxxxxxx-xxx...", "ClientSecret": "asasasasasas", "CallbackPath": "/Login/signin-oidc", "SignedOutCallbackPath": "/Login/signout-oidc" }
Azure门户配置
已在重定向URI中添加:https://localhost:81/Login/signin-oidc
LoginController 代码片段
[Authorize] [ActionName("signin-oidc")] public IActionResult SignInRedirectFromActiveDirectory() { return null; }
问题修复步骤
移除LoginController回调Action的[Authorize]特性
回调路径/Login/signin-oidc是Azure AD返回认证结果的端点,此时用户还未完成本地Cookie登录,添加[Authorize]会触发认证循环,直接跳回登录页导致回调失败。修改后代码:[ActionName("signin-oidc")] public IActionResult SignInRedirectFromActiveDirectory() { // 可添加自定义逻辑,比如跳转到首页或用户中心 return RedirectToAction("Index", "Home"); }保证认证中间件顺序正确
在Program.cs中,中间件必须按以下顺序配置:
先调用app.UseAuthentication(),再调用app.UseAuthorization()。顺序错误会导致回调时认证逻辑不生效。简化OpenIdConnect事件处理逻辑
当前OnTokenValidated事件中手动调用SignInAsync可能与Microsoft.Identity.Web的内置逻辑冲突,建议简化为:services.Configure<OpenIdConnectOptions>(conn.Name, options => { options.Events.OnTokenValidated += async context => { // 这里添加自定义逻辑,比如获取用户额外信息 // 无需手动调用SignInAsync,Microsoft.Identity.Web会自动处理Cookie登录 }; });若必须手动处理登录,需使用正确的认证Scheme,且不要覆盖内置事件处理逻辑。
明确:CallbackPath无需手动映射Controller Action
Microsoft.Identity.Web会自动处理CallbackPath对应的端点,不需要在LoginController中创建对应Action。如果需要在认证完成后跳转指定页面,可配置OpenIdConnectOptions的PostLogoutRedirectUri,或在OnAuthorizationCodeReceived事件中处理跳转。检查Azure门户重定向URI完全匹配
确保门户中配置的重定向URI与应用内的CallbackPath完全一致,包括协议、端口、路径,无多余斜杠或大小写错误。
内容的提问来源于stack exchange,提问作者gtezini

