ASP.Net 5 - oth承载令牌(JWT)验证错误
本文关键字:JWT 验证 错误 令牌 Net oth ASP | 更新日期: 2023-09-27 18:02:27
我一直在使用JSON Web令牌对我的网站上的用户进行身份验证和授权的系统。我的系统即将完成,但是当我试图在代码中使用[Authorize("Bearer")]属性时,我遇到了一个错误。错误如下:
System.IdentityModel.Tokens。SecurityTokenInvalidSignatureException发生消息:抛出异常:'System.IdentityModel.Tokens. '。Microsoft.IdentityModel.Logging.dll中的SecurityTokenInvalidSignatureException'附加信息:IDX10503:签名验证失败。Keys试了试:"。捕获异常:"。令牌:"{"typ":"JWT"、"alg":"RS256"、"孩子":零},{"nameid":"6581 f5a0 - 1775 - 4 - ce4 - 8650 a3d7e613b216"、"unique_name":"亚历克斯","AspNet.Identity.SecurityStamp":"8 da933c3 - 0 - f88 - 42 - ea - 876 d - c07e99d1eecc"、"国际空间站":"Uniti"、"澳大利亚":"Uniti"、"经验值":1436849284,"nbf":1436845684}"
我不明白为什么它没有用JWT测试任何键。我在启动文件中定义了一个RSA密钥。不用再拖下去了,我已经在下面提供了解决这个错误可能需要的代码。
我的启动代码(生成密钥和OAuthBearer选项):#region RSA Key Generation
var rsa = new RSACryptoServiceProvider(2048);
var rsaKey = rsa.ExportParameters(true);
var key = new RsaSecurityKey(rsaKey);
services.AddInstance(new SigningCredentials(key, SecurityAlgorithms.RsaSha256Signature, SecurityAlgorithms.Sha256Digest));
#endregion
services.AddInstance(new OAuthBearerAuthenticationOptions
{
SecurityTokenValidators = new List<ISecurityTokenValidator>
{
new JwtSecurityTokenHandler()
},
TokenValidationParameters = new TokenValidationParameters
{
IssuerSigningKey = key,
ValidIssuer = "Uniti",
ValidAudience = "Uniti"
},
});
services.AddAuthorization();
services.ConfigureAuthorization(auth =>
{
auth.AddPolicy("Bearer", builder =>
{
builder.AddAuthenticationSchemes(OAuthBearerAuthenticationDefaults.AuthenticationScheme);
builder.RequireAuthenticatedUser();
});
});
我的令牌生成代码:
var claimsIdentity = (ClaimsIdentity) User.Identity;
var handler = BearerOptions.SecurityTokenValidators.OfType<JwtSecurityTokenHandler>().First();
var securityToken = handler.CreateToken(
issuer: "Uniti",
audience: "Uniti",
signingCredentials: BearerCredentials,
subject: claimsIdentity
);
var token = handler.WriteToken(securityToken);
是我忘记在某处添加一些东西,还是我错误地生成密钥?如果你能帮助我,提前感谢!
我打赌这是由于不正确的注册OAuth2承载选项的方式,正如我之前的回答所解释的那样:https://stackoverflow.com/a/31322654/542757
services.AddInstance(new OAuthBearerAuthenticationOptions());
当您使用services.AddInstance
时,OAuth2承载中间件无法检索选项(因此,密钥),因为它内部使用IOptions<OAuthBearerAuthenticationOptions>
而不是OAuthBearerAuthenticationOptions
。
这是注册OAuth2持有者选项的正确的方式:
services.ConfigureOAuthBearerAuthentication(options => {
// Configure the options used by the OAuth2 bearer middleware.
});