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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:36:03