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

