簡體   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