我一直致力于使用JSON Web令牌在我的网站上对用户进行身份验证和授权的系统。我的系统刚刚完成,但当我尝试在我的代码中使用[Authorize(" Bearer")]属性时,我遇到了错误。错误如下:
发生System.IdentityModel.Tokens.SecurityTokenInvalidSignatureException 消息:抛出异常:' System.IdentityModel.Tokens.SecurityTokenInvalidSignatureException'在Microsoft.IdentityModel.Logging.dll中 其他信息:IDX10503:签名验证失败。钥匙尝试了:''。 遇到例外情况: '&#39 ;. 令牌:' {"典型":" JWT"," alg":" RS256","孩子&#34 ;日期null} {"&填充NameID#34;:" 6581f5a0-1775-4ce4-8650-a3d7e613b216"" UNIQUE_NAME":"阿莱克斯&#34 ;, " AspNet.Identity.SecurityStamp":" 8da933c3-0f88-42ea-876d-c07e99d1eecc"" ISS":" Uniti的"&# 34; AUD":" Uniti的""&EXP#34;: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);
我忘记在某处添加某些内容,或者我是否错误地生成了密钥?如果你能帮助我,请提前感谢!
答案 0 :(得分:2)
我敢打赌,由于注册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.
});