ASP.NET Core 5中能否同时配置OAuth和证书两种认证方式?
问题解答
ASP.NET Core 5完全支持同时启用OAuth(JWT Bearer)和证书两种认证方式,你遇到的覆盖问题是因为重复调用了AddAuthentication()方法并传入了不同的默认认证方案,后调用的配置会覆盖之前的默认配置。
正确配置步骤
1. 统一注册认证服务
不要分开两次调用AddAuthentication(),单次调用后链式追加两种认证方案即可:
services.AddAuthentication() // 配置原有Azure AD JWT Bearer认证 .AddAzureADBearer(options => { options.Instance = aADInstance; options.ClientId = clientIdWithScope; options.Domain = aADDomain; options.TenantId = aADTenantId; }) // 追加证书认证 .AddCertificate(options => { // 可按需配置证书校验规则,示例为允许自签名证书、关闭吊销校验 options.AllowedCertificateTypes = CertificateTypes.All; options.RevocationMode = X509RevocationMode.NoCheck; });
2. 配置双重校验授权策略
如果你的需求是调用方必须同时通过OAuth认证和证书认证才算身份校验通过,需要新增一个联合授权策略:
services.AddAuthorization(options => { options.AddPolicy("DoubleAuthValidate", policy => { // 指定该策略需要同时验证两种认证方案的结果 policy.AddAuthenticationSchemes( AzureADDefaults.JwtBearerAuthenticationScheme, CertificateAuthenticationDefaults.AuthenticationScheme ); policy.RequireAuthenticatedUser(); // 可追加其他自定义权限校验规则 }); });
3. 调整中间件配置顺序
注意证书转发、认证、授权中间件的顺序不能乱:
// 如果服务部署在反向代理后,需要先添加证书转发配置 app.UseCertificateForwarding(); // 认证中间件必须放在授权中间件之前 app.UseAuthentication(); app.UseAuthorization();
4. 应用认证策略
在需要双重校验的Controller或接口上添加特性即可:[Authorize(Policy = "DoubleAuthValidate")]
如果不需要全局双重校验,也可以给不同接口单独指定不同的认证方案,分别用[Authorize(AuthenticationSchemes = AzureADDefaults.JwtBearerAuthenticationScheme)]或者[Authorize(AuthenticationSchemes = CertificateAuthenticationDefaults.AuthenticationScheme)]即可。
内容的提问来源于stack exchange,提问作者sabaedge
相关产品推荐
相关产品推荐

