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

ASP.NET Core 6 MVC集成Azure AD认证回调路径失败问题求助

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:11:00