忽略JWT Bearer令牌签名(即不验证令牌)

Eli*_*nti 8 c# asp.net-core

我有一个位于API网关后面的API。在将请求传递到API之前,API网关会验证承载令牌。

我的API使用asp.net core 2.0本机身份验证和基于声明的授权框架。从JWT令牌获取声明的艰巨工作是由中间件进行的Microsoft.AspNetCore.Authentication.JwtBearer

可以将该中间件配置为忽略令牌上的到期日期,并且还可以指定本地公共密钥,这样就不必联系令牌颁发机构来获取它,而是可以仅禁用令牌验证。令牌?

这将允许将未签名的令牌用于开发中的临时测试,并防止生产中的双重验证(网关和API)。

Ong*_*oon 9

尝试这个。终于,经过大量的尝试,我终于开始工作了。

public TokenValidationParameters CreateTokenValidationParameters()
{
    var result = new TokenValidationParameters
    {
    ValidateIssuer = false,
    ValidIssuer = ValidIssuer,

    ValidateAudience = false,
    ValidAudience = ValidAudience,

    ValidateIssuerSigningKey = false,
    //IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(SecretKey)),
    //comment this and add this line to fool the validation logic
    SignatureValidator = delegate(string token, TokenValidationParameters parameters)
    {
        var jwt = new JwtSecurityToken(token);

        return jwt;
    },

    RequireExpirationTime = true,
    ValidateLifetime = true,

    ClockSkew = TimeSpan.Zero,
    };

    result.RequireSignedTokens = false;

    return result;
}
Run Code Online (Sandbox Code Playgroud)

  • 我为此苦苦挣扎了 2 天的不间断测试,终于让它发挥作用。呜啦啦... (2认同)
  • 也适用于 .NET 5。如果您只想跳过密钥验证,则只需设置 ValidateIssuerSigningKey = false 并分配 SignatureValidator = (token, _) => new JwtSecurityToken(token); 与此答案中显示的内容类似。 (2认同)

Set*_*Set 6

您可以使用设置令牌验证JwtBearerOptions.TokenValidationParameters。您可以检查类定义中的所有可用参数。

Microsoft.IdentityModel.Tokens.SecurityTokenHandler包含验证 时使用的一组参数Microsoft.IdentityModel.Tokens.SecurityToken

如果您想完全禁用验证,请将 AllValidateXXX和bool 属性设置为 false:RequireXXX

.AddJwtBearer("<authenticationScheme>", configureOptions =>
{
   options.TokenValidationParameters.ValidateActor = false;
   options.TokenValidationParameters.ValidateAudience = false;
   options.TokenValidationParameters.ValidateIssuerSigningKey = false;
   ...
}
Run Code Online (Sandbox Code Playgroud)

作为另一个选项,您可以通过将自己的实现设置为来覆盖默认令牌签名验证JwtBearerOptions.SignatureValidator

// Gets or sets a delegate that will be used to validate the signature of the token.
//
// Remarks:
//  If set, this delegate will be called to signature of the token, instead of normal
//  processing.
public SignatureValidator SignatureValidator { get; set; }
Run Code Online (Sandbox Code Playgroud)

其中SignatureValidator委托定义为:

public delegate SecurityToken SignatureValidator(string token, TokenValidationParameters validationParameters);
Run Code Online (Sandbox Code Playgroud)