为 ASP.NET Core 添加自定义验证到 JWT 令牌?

Add custom validation to JWT token for ASP.NET Core?

以前,我能够使用 JwtBearerAuthenticationOptions 添加自定义令牌处理程序和自定义验证。现在有了 Core UseJwtBearerAuthentication,我需要使用 JwtBearerOptions,它似乎没有覆盖 JwtSecurityTokenHandler 的选项。我基本上想覆盖 JwtSecurityTokenHandler 中的以下方法:

protected virtual JwtSecurityToken ValidateSignature(string token, TokenValidationParameters validationParameters)

之前:

app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
{
    TokenHandler = new MyTokenHandler()
    // other properties here
});

目前 ASP.NET 核心:

app.UseJwtBearerAuthentication(new JwtBearerOptions
{
    // other properties here
});

JwtBearerOptions有个参数叫TokenValidationParameters,所以可以用这个参数:

var tokenValidationParameters = new TokenValidationParameters
{
    ValidateIssuerSigningKey = true,
    IssuerSigningKey = signingKey,
    //...
};

app.UseJwtBearerAuthentication(new JwtBearerOptions
{
    //...
    TokenValidationParameters = tokenValidationParameters
});

如果您想实际创建自己的 JwtSecurityTokenHandler 并覆盖 ValidateSignature 方法,您可以使用 SecurityTokenValidators 属性:

var options new JwtBearerOptions();
options.SecurityTokenValidators.Clear();
options.SecurityTokenValidators.Add(new MyTokenHandler());
app.UseJwtBearerAuthentication(options);

从技术上讲,对 Clear() 的调用不是必需的 - 只要其中一个令牌处理程序可以解析令牌,对身份验证的调用就会成功。但是,如果 JwtSecurityTokenHandler 在您的情况下永远不会成功,则删除它似乎是有道理的。