繁体   English   中英

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

[英]Ignore JWT Bearer token signature (i.e. don't validate token)

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

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

这个中间件可以配置为忽略令牌上的到期日期,也可以指定一个本地公钥,这样就不需要联系令牌授权来获取一个,但是否可以只禁用签名验证令牌?

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

试试这个。 终于,经过这么多的尝试,我让它工作了。

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

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

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

如果您想完全禁用验证,请将所有ValidateXXXRequireXXX bool 属性设置为 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);

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM