.NET Core 3.1授权框架如何自定义OpenIdConnectProtocolValidator的at_hash验证
实现步骤
步骤1:自定义OpenIdConnect协议验证器
继承官方OpenIdConnectProtocolValidator类,重写ValidateHash方法,按你实际的at_hash生成逻辑实现校验规则:
using Microsoft.IdentityModel.Protocols.OpenIdConnect; using System.Security.Claims; public class CustomOpenIdConnectProtocolValidator : OpenIdConnectProtocolValidator { protected override void ValidateHash(OpenIdConnectProtocolValidationContext validationContext, Claim hashClaim, string algorithm, string valueToHash) { // 此处替换为你自己的at_hash校验逻辑 // 如果你需要完全跳过hash校验,直接空实现即可 bool isValid = YourCustomHashValidationLogic(hashClaim.Value, valueToHash, algorithm); if (!isValid) { throw new OpenIdConnectProtocolValidationException("at_hash校验失败"); } } private bool YourCustomHashValidationLogic(string hashClaimValue, string originalValue, string signingAlgorithm) { // 适配第三方身份提供商的自定义hash生成规则实现校验逻辑 return true; } }
步骤2:替换OpenIdConnect配置中的默认验证器
修改你现有的服务注册代码,在AddOpenIdConnect配置块中指定自定义的验证器:
services.AddAuthorization(cfg => { cfg.AddPolicy("MyPolicy", cfgPolicy => { cfgPolicy.AddRequirements().RequireAuthenticatedUser(); cfgPolicy.AddAuthenticationSchemes(OpenIdConnectDefaults.AuthenticationScheme); }); }).AddAuthentication(cfg => { cfg.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; cfg.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; }) .AddCookie() .AddOpenIdConnect(cfg => { cfg.ClientId = authenticationConfig.ClientId; cfg.ClientSecret = authenticationConfig.ClientSecret; cfg.ResponseType = "code"; cfg.CallbackPath = "/login/callback"; cfg.GetClaimsFromUserInfoEndpoint = true; cfg.Scope.Clear(); cfg.Scope.Add("openid"); cfg.Configuration = new OpenIdConnectConfiguration { AuthorizationEndpoint = authenticationConfig.UrlSts + "authorize", TokenEndpoint = "https://interal.io/api/oauth/token", UserInfoEndpoint = "https://interal.io/api/oauth/token_info" }; // 新增以下行,替换默认协议验证器为你的自定义实现 cfg.ProtocolValidator = new CustomOpenIdConnectProtocolValidator(); });
若只是临时排查问题需要跳过at_hash校验,直接在重写的
ValidateHash方法中留空实现即可,无需抛出异常。
内容的提问来源于stack exchange,提问作者Ronaldo Lanhellas
相关产品推荐
相关产品推荐

