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

