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

在Microsoft.AspNetCore.Identity本地用户基础上集成Azure AD遇问题

解决Azure AD登录后控制器中User信息为空的问题

问题原因

你的HandleLoginRedirect方法添加了[AllowAnonymous]特性,这会让ASP.NET Core跳过该请求的身份验证流程,导致User.Identity及相关声明为空。另外,Microsoft.Identity.Web已自动完成登录后的票据生成与存储,无需手动接收token参数。

修复方案

1. 移除匿名访问特性

删除HandleLoginRedirect方法上的[AllowAnonymous],让ASP.NET Core自动验证用户身份,此时就能正常获取User对象的信息:

[HttpGet]
public async Task<IActionResult> HandleLoginRedirect()
{
    var userAccount = User.Identity;
    var userClaims = User.Identity as System.Security.Claims.ClaimsIdentity;

    // 获取用户姓名与邮箱
    var name = userClaims?.FindFirst("name")?.Value;
    var email = userClaims?.FindFirst(System.Security.Claims.ClaimTypes.Email)?.Value;

    // 查找或创建本地账户
    // 示例:var localUser = await _userManager.FindByEmailAsync(email);
    // if (localUser == null) { /* 创建逻辑 */ }

    return View("SelectBuilding");
}

2. 确保回调路径配置正确

在Program.cs中配置Azure AD时,保证回调路径与登录流程一致。Microsoft.Identity.Web默认回调路径为/signin-oidc,若自定义路径需明确指定:

builder.Services.AddMicrosoftIdentityWebAppAuthentication(builder.Configuration)
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddInMemoryTokenCaches();

// 若使用自定义回调路径,需修改配置:
// .AddMicrosoftIdentityWebAppAuthentication(builder.Configuration, "AzureAd", "CookieAuthenticationScheme", "/your-custom-callback");

3. 在Token验证阶段关联本地账户

利用OnTokenValidated事件,在身份验证完成后立即处理本地账户的查找或创建,确保进入控制器前用户已完成关联:

builder.Services.AddMicrosoftIdentityWebAppAuthentication(builder.Configuration)
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddInMemoryTokenCaches()
    .AddCookie(options =>
    {
        options.Events.OnTokenValidated = async context =>
        {
            var userManager = context.HttpContext.RequestServices.GetRequiredService<UserManager<IdentityUser>>();
            var email = context.SecurityToken.Claims.FirstOrDefault(c => c.Type == System.Security.Claims.ClaimTypes.Email)?.Value;

            if (!string.IsNullOrEmpty(email))
            {
                var localUser = await userManager.FindByEmailAsync(email);
                if (localUser == null)
                {
                    // 创建本地用户账户
                    localUser = new IdentityUser { UserName = email, Email = email };
                    await userManager.CreateAsync(localUser);
                }
                // 可在此添加自定义声明、角色关联等逻辑
            }
        };
    });

核心注意事项

  • 需获取用户身份的方法,切勿添加[AllowAnonymous]特性,否则会跳过身份验证。
  • Microsoft.Identity.Web已封装OIDC登录的完整流程,无需手动处理token参数。
  • OnTokenValidated是处理用户身份关联的最佳时机,此时token已验证通过,用户信息可信。

内容的提问来源于stack exchange,提问作者A-Lone-Developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:10:54