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

已配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:05:09