[英]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
。
如果您想完全禁用驗證,請將所有ValidateXXX
和RequireXXX
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.