我试图用下面的代码验证一个有效的JWT,但是得到一个奇怪的错误
"IDX10501: Signature validation failed. Unable to match key:
kid: 'System.String'.
Exceptions caught:
'System.Text.StringBuilder'.
token: 'System.IdentityModel.Tokens.Jwt.JwtSecurityToken'."
这是我的验证方法
ClaimsPrincipal principal = null;
var token = "JWT GOES HERE"
try
{
string sec = "000uVmTXj5EzRjlnqruWF78JQZMT";
var securityKey = new SymmetricSecurityKey(System.Text.Encoding.Default.GetBytes(sec));
var now = DateTime.UtcNow;
SecurityToken securityToken;
string tokenIssuer = "https://MyIssuer.com";
TokenValidationParameters validationParameters = new TokenValidationParameters()
{
ValidIssuer = tokenIssuer,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
IssuerSigningKey = securityKey
};
JwtSecurityTokenHandler handler = new JwtSecurityTokenHandler();
principal = handler.ValidateToken(token, validationParameters, out securityToken); <---Errors here
}
这是我的JWT的价值。我使用了正确的发行商
{
"alg": "RS256",
"kid": "dev",
"x5t": "Sm7aAUSt4Fdv7X1b9jQDf8XwbvQ",
"pi.atm": "xxe8"
}.{
"scope": [],
"client_id": "ClientABC",
"iss": "https://MyIssuer.com",
"jti": "1JLDz",
"sub": "ClientABC",
"exp": 1601609852
}.[Signature]
我在这里错过了什么?对称安全密钥是对称安全密钥,因为这个算法是RS256吗?我的令牌验证参数中是否缺少某些内容?
更新 经过进一步调查,我得到了错误。
IDX10501: Signature validation failed. Unable to match key:
kid: 'dev'.
Exceptions caught:
'System.NotSupportedException: IDX10634: Unable to create the SignatureProvider.
Algorithm: 'RS256', SecurityKey: 'Microsoft.IdentityModel.Tokens.SymmetricSecurityKey, KeyId: '', InternalId: 'TdfWgWjCVeM60F3C5TOogJuka1aR5FA_xchwhY9MHH4'.'
is not supported. The list of supported algorithms is available here: https://aka.ms/IdentityModel/supported-algorithms
at Microsoft.IdentityModel.Tokens.CryptoProviderFactory.CreateSignatureProvider(SecurityKey key, String algorithm, Boolean willCreateSignatures, Boolean cacheProvider)
问题是您正在尝试使用具有非对称算法的对称密钥。RSA 算法需要公钥和私钥。
尝试使用对称算法,如HS256(HMAC-SHA256)。
尝试使用安全算法.HmacSha256
发布令牌时的示例:
Users user = _context.Users.FirstOrDefault(c => c.UserName == userName && c.Password == password);
if(user == null)
{
return Unauthorized();
}
Claim[] claims = new Claim[]
{
new Claim("Id", user.Id.ToString()),
new Claim("Name", user.Name),
new Claim("Email", user.Email),
};
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("000uVmTXj5EzRjlnqruWF78JQZMT"));
var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
var token = new
JwtSecurityToken(
"MyProject",
"MyClient",
claims,
expires: DateTime.Now.AddMinutes(30),
signingCredentials: signingCredentials);
return Ok(new JwtSecurityTokenHandler().WriteToken(token));
如果使用的是 .net 核心应用,则在 Startup.cs 的 ConfigureServices 方法中编写以下代码来验证令牌:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.RequireHttpsMetadata = false;
options.SaveToken = true;
options.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuer = true,
ValidateAudience = true,
ValidAudience = "MyClient",
ValidIssuer = "MyProject",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("000uVmTXj5EzRjlnqruWF78JQZMT"))
};
});
另外,不要忘记将以下行添加到“启动”中的“配置”方法中.cs
app.UseAuthentication();
app.UseAuthorization();
问题内容: 今天,我在应用程序中遇到了奇怪的错误。我已经测试了2个小时,但没有找到解决方案。也许您可以帮助我解决这个问题。所以这里是: 输出: 似乎该模式在第二个元素之后被丢弃了-不管我选择什么顺序(我试图交换它们,因为我认为数字会导致此错误-但事实并非如此)。现在我不知道发生了什么。 我正在使用gcc版本4.6.3(Debian 4.6.3-1)。 问题答案: 正则表达式库大多数尚未在libst
我的问题是:这是一个bug还是我遗漏了什么? 事实上,不同的匹配器以不同的格式返回消息是一个很大的问题,因为我试图编写一些自定义的验证框架,该框架使用匹配器,并且能够在出现任何错误时返回良好的人类可读的消息。我似乎不能为此目的使用方法...
我正在使用asp。net核心与openiddict,为了授权,我使用jwtmiddleware 但由于某些原因,它抛出了这个错误,任何帮助都将不胜感激。 info: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware[7] Bearer 未经过身份验证.失败消息:IDX10501:签名验证失败。无法匹配“孩子”: “7
问题内容: 我正在尝试使用url从jira服务器下载文件,但出现错误。如何在代码中包括证书以验证 错误: 我的Nodejs代码: 问题答案: 尝试添加适当的根证书 这总是比盲目地接受未经授权的端点要安全得多的选择,后者只能被用作最后的手段。 这可以像添加一样简单 到您的应用程序。 该SSL根CA NPM包(这里使用的)是关于这个问题的一个非常有用的包。
我试图使用URL从jira服务器下载一个文件,但我遇到了一个错误。如何在代码中包含证书以进行验证? 错误: 我的Nodejs代码:
我刚开始使用ANTLR4。我试图为一个简单的程序编写语法规则,但我很难让它工作。 null 任何帮助都很感激!