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

时间:2018-04-20 01:36:52

标签: c# asp.net-core

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

我的API使用asp.net核心2.0本机身份验证和基于声明的授权框架。从JWT令牌获取声明的繁琐工作由Microsoft.AspNetCore.Authentication.JwtBearer中的中间件完成。

可以将此中间件配置为忽略令牌上的过期日期,并且还可以指定本地公钥,因此无需联系令牌权限以获取令牌,但是是否可以仅禁用令牌上的签名验证?

这将允许在开发中使用无符号令牌进行临时测试,并防止在生产中进行双重验证(网关和API)。

3 个答案:

答案 0 :(得分:5)

尝试一下。终于,经过这么多的尝试,我才开始使用它。

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;
}

答案 1 :(得分:2)

您可以使用JwtBearerOptions.TokenValidationParameters设置令牌验证。您可以从the class definition检查所有可用参数。

  

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

如果您想完全禁用验证,请将所有ValidateXXXRequireXXX布尔属性设置为false:

.AddJwtBearer("<authenticationScheme>", configureOptions =>
{
   options.TokenValidationParameters.ValidateActor = false;
   options.TokenValidationParameters.ValidateAudience = false;
   options.TokenValidationParameters.ValidateIssuerSigningKey = false;
   ...
}

作为另一个选项,您可以通过将自己的实现设置为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; }

其中SignatureValidator委托定义为:

public delegate SecurityToken SignatureValidator(string token, TokenValidationParameters validationParameters);

答案 2 :(得分:1)

我能够稍微清理一下代码,这表明我们可以更改标志并在设置标志时更加一致。

services.AddAuthentication(o =>
{
    o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
    .AddJwtBearer(o =>
    {
        o.RequireHttpsMetadata = false;
        o.SaveToken = true;
        o.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = false,
            ValidateAudience = false,
            ValidateIssuerSigningKey = false,
            ValidateLifetime = false,
            RequireExpirationTime = false,
            RequireSignedTokens = false
        };
    });