已配置ASP.NET Identity的.NET 8内网Web应用集成Azure AD认证问题
解决方案
问题根源在于AddIdentity方法内部会自动将默认认证Scheme设置为IdentityConstants.ApplicationScheme,覆盖你之前配置的Azure AD OIDC Scheme,导致应用优先使用ASP.NET Identity认证。下面是两种可行的修改方案:
方案一:保留AddIdentity,手动重置默认认证Scheme
先注册Identity服务,再重新配置认证的默认Scheme为Azure AD的OIDC:
// 1. 注册ASP.NET Identity服务,保留UserManager、RoleManager等组件 services.AddIdentity<ApplicationUser, ApplicationRole>(options => { options.Password.RequireNonAlphanumeric = false; }) .AddEntityFrameworkStores<IdentityDbContext>() .AddDefaultTokenProviders(); // 2. 配置Azure AD认证 services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd")); // 3. 手动重置默认认证Scheme,覆盖AddIdentity的自动设置 services.Configure<AuthenticationOptions>(options => { options.DefaultAuthenticateScheme = OpenIdConnectDefaults.AuthenticationScheme; options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; // Azure AD认证后会用Cookie保存身份,需指定对应的Scheme options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme; });
方案二:使用AddIdentityCore替代AddIdentity
AddIdentityCore仅注册UserManager、RoleManager等核心服务,不会修改默认认证Scheme,更适合只需要Identity管理功能、不需要Identity自带认证流程的场景:
// 1. 注册Identity核心服务,不干预认证配置 services.AddIdentityCore<ApplicationUser>(options => { options.Password.RequireNonAlphanumeric = false; }) .AddRoles<ApplicationRole>() // 添加角色支持 .AddEntityFrameworkStores<IdentityDbContext>() .AddDefaultTokenProviders() .AddSignInManager<SignInManager<ApplicationUser>>(); // 手动添加SignInManager // 2. 配置Azure AD认证,默认Scheme直接生效 services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"));
额外优化:关联Azure AD用户与Identity用户
员工通过Azure AD登录后,需要关联到ASP.NET Identity中的用户才能进行客户运维操作,可以在Azure AD的认证事件中完成用户关联:
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"), options => { options.Events = new OpenIdConnectEvents { OnTokenValidated = async context => { var userManager = context.HttpContext.RequestServices.GetRequiredService<UserManager<ApplicationUser>>(); // 从Azure AD Claims中获取用户邮箱 var email = context.Principal.FindFirstValue(ClaimTypes.Email); // 查询或创建对应的Identity用户 var user = await userManager.FindByEmailAsync(email); if (user == null) { user = new ApplicationUser { UserName = email, Email = email }; var createResult = await userManager.CreateAsync(user); if (!createResult.Succeeded) { throw new InvalidOperationException("创建员工Identity用户失败:" + string.Join(", ", createResult.Errors.Select(e => e.Description))); } } // 添加Identity角色到当前用户Claims var roles = await userManager.GetRolesAsync(user); var claimsIdentity = new ClaimsIdentity(context.Principal.Identity); foreach (var role in roles) { claimsIdentity.AddClaim(new Claim(ClaimTypes.Role, role)); } context.Principal = new ClaimsPrincipal(claimsIdentity); } }; });
这样修改后,应用会优先使用Azure AD认证,同时UserManager、SignInManager等Identity组件可以正常使用,满足员工运维客户的需求。
内容的提问来源于stack exchange,提问作者user27046570
相关产品推荐
相关产品推荐

