在 .NET 授权框架中自定义 At_hash 验证
Customize At_hash Validation in .NET Authorization framework
我正在使用 .Net Core 3.1 授权框架使 Openid 流,并将我的授权重定向到第三方提供商,这是我的配置:
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"
};
});
但是我在 class OpenIdConnectProtocolValidator 的 ValidationHash 步骤中遇到错误。我的 at_hash 声明是以不同的方式生成的,不等于此处指定的:https://openid.net/specs/openid-connect-core-1_0.html#IDTokenValidation。
如何在 class OpenIdConnectProtocolValidator 中自定义 ValidateHash 方法??
可以用您自己的实现覆盖 OpenIdConnectProtocolValidator
。
public class CustomOpenIdConnectProtocolValidator : OpenIdConnectProtocolValidator
{
protected override void ValidateAtHash(OpenIdConnectProtocolValidationContext validationContext)
{
// Custom validation.
}
}
比起在Startup.cs
你可以自定义协议验证器:
.AddOpenIdConnect(cfg =>
{
cfg.ProtocolValidator = new CustomOpenIdConnectProtocolValidator();
});
但要小心; at_hash
值应该是 access_token 值的 ASCII 表示的八位字节散列的 left-most 一半的 base64url 编码,其中使用的散列算法是在中使用的散列算法ID Token 的 JOSE 的 alg Header 参数 Header.
规范就是规范是有原因的。您应该有充分的理由偏离规范。
我正在使用 .Net Core 3.1 授权框架使 Openid 流,并将我的授权重定向到第三方提供商,这是我的配置:
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"
};
});
但是我在 class OpenIdConnectProtocolValidator 的 ValidationHash 步骤中遇到错误。我的 at_hash 声明是以不同的方式生成的,不等于此处指定的:https://openid.net/specs/openid-connect-core-1_0.html#IDTokenValidation。
如何在 class OpenIdConnectProtocolValidator 中自定义 ValidateHash 方法??
可以用您自己的实现覆盖 OpenIdConnectProtocolValidator
。
public class CustomOpenIdConnectProtocolValidator : OpenIdConnectProtocolValidator
{
protected override void ValidateAtHash(OpenIdConnectProtocolValidationContext validationContext)
{
// Custom validation.
}
}
比起在Startup.cs
你可以自定义协议验证器:
.AddOpenIdConnect(cfg =>
{
cfg.ProtocolValidator = new CustomOpenIdConnectProtocolValidator();
});
但要小心; at_hash
值应该是 access_token 值的 ASCII 表示的八位字节散列的 left-most 一半的 base64url 编码,其中使用的散列算法是在中使用的散列算法ID Token 的 JOSE 的 alg Header 参数 Header.
规范就是规范是有原因的。您应该有充分的理由偏离规范。