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

.NET如何区分不同身份验证方案对应的Claims Identity

解决方法:无需弃用AddMicrosoftIdentityWebApp,直接扩展配置标记身份验证方案

你完全不用弃用AddMicrosoftIdentityWebApp,这个中间件提供了重载方法允许你访问底层的OpenIdConnectOptions配置,从而添加自定义逻辑标记每个Claims Identity对应的身份验证方案。具体步骤如下:

1. 配置身份验证方案时,添加自定义Claim标记方案名称

在调用AddMicrosoftIdentityWebApp时,使用带配置委托的重载,在OnTokenValidated事件中为当前Claims Identity添加一个用于标识方案的自定义Claim:

services.AddAuthentication()
    // 第一个身份验证方案
    .AddMicrosoftIdentityWebApp(options =>
    {
        Configuration.Bind("FirstAuthScheme", options);
    }, cookieOptions =>
    {
        cookieOptions.Cookie.Name = "FirstAuthCookie";
    }, "FirstAuthScheme") // 指定方案名称
    .AddOpenIdConnect(options =>
    {
        Configuration.Bind("FirstAuthScheme", options);
        options.Events.OnTokenValidated = context =>
        {
            // 给当前Identity添加方案标识Claim
            context.Principal.Identities.First().AddClaim(new Claim("auth_scheme", "FirstAuthScheme"));
            return Task.CompletedTask;
        };
    })

    // 第二个身份验证方案
    .AddMicrosoftIdentityWebApp(options =>
    {
        Configuration.Bind("SecondAuthScheme", options);
    }, cookieOptions =>
    {
        cookieOptions.Cookie.Name = "SecondAuthCookie";
    }, "SecondAuthScheme") // 指定方案名称
    .AddOpenIdConnect(options =>
    {
        Configuration.Bind("SecondAuthScheme", options);
        options.Events.OnTokenValidated = context =>
        {
            context.Principal.Identities.First().AddClaim(new Claim("auth_scheme", "SecondAuthScheme"));
            return Task.CompletedTask;
        };
    });

2. 在授权要求中验证双身份及方案匹配

创建自定义授权要求和处理程序,通过自定义的auth_scheme Claim来区分不同的身份验证方案,同时检查每个Claims Identity的状态:

// 自定义授权要求
public class DualAuthRequirement : IAuthorizationRequirement { }

// 授权处理程序
public class DualAuthHandler : AuthorizationHandler<DualAuthRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, DualAuthRequirement requirement)
    {
        var identities = context.User.Identities.Where(i => i.IsAuthenticated).ToList();
        
        // 检查是否存在两个已验证的身份,且分别对应两个方案
        var hasFirstScheme = identities.Any(i => i.HasClaim("auth_scheme", "FirstAuthScheme"));
        var hasSecondScheme = identities.Any(i => i.HasClaim("auth_scheme", "SecondAuthScheme"));
        
        if (hasFirstScheme && hasSecondScheme)
        {
            context.Succeed(requirement);
        }
        
        return Task.CompletedTask;
    }
}

3. 注册授权处理程序

在Startup或Program.cs中注册自定义授权处理程序:

services.AddSingleton<IAuthorizationHandler, DualAuthHandler>();

关键说明

AddMicrosoftIdentityWebApp本质是对AddOpenIdConnect和AddCookie的封装,通过链式调用.AddOpenIdConnect()可以直接覆盖或扩展底层的OpenID Connect配置,包括OnTokenValidated事件。这种方式既保留了Microsoft Identity Web的便捷性,又能实现自定义的身份标记逻辑。

内容的提问来源于stack exchange,提问作者Tom Troughton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:12:55