我试图在Asp.net核心中使用JsonWebTokens(JWT)进行用户身份验证。
当我在我的应用程序中运行登录方法时,令牌是正确生成的,但是,当我试图转到一个受[Authorize]
属性限制的方法时,我会得到一个401未经授权的错误。
error=\ error=\"invalid_token\",error_description=\“签名无效”
这是我在ConfigureServices
方法中如何在Startup
中配置的。
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(x =>
{
var key = Encoding.ASCII.GetBytes("asdwda1d8a4sd8w4das8d*w8d*asd@#");
var signingKey = new SymmetricSecurityKey(key);
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = signingKey,
ValidAudience = "Audience",
ValidIssuer= "Issuer",
ValidateIssuer = false,
ValidateAudience = false
};
});
这就是我在Startup
中的配置中的配置方式
app.UseAuthentication();
这是LoginController
中的令牌生成
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[]
{
new Claim("UserID", login.IdUsuario.ToString())
}),
Expires = DateTime.UtcNow.AddDays(1),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(Encoding.ASCII.GetBytes("asdwda1d8a4sd8w4das8d*w8d*asd@#")),
SecurityAlgorithms.HmacSha256Signature)
};
var tokenHandler = new JwtSecurityTokenHandler();
var securityToken = tokenHandler.CreateToken(tokenDescriptor);
var token = tokenHandler.WriteToken(securityToken);
return Ok( new { token } );
这是我限制的类,也就是拒绝访问
[HttpGet]
[Authorize]
[Route("Profile")]
public IActionResult Profile()
{
string userID = User.Claims.First(c => c.Type == "UserID").Value;
var resultado = _UsuarioServicio.Profile(int.Parse(userID));
return Ok(resultado);
}
我正在用postman测试这个,我已经添加了相应的标题。
非常感谢你抽出时间来看这个!
发布于 2020-05-05 11:34:35
令牌中的key
与您在配置中设置的内容不匹配。它们必须完全匹配。
发布于 2020-05-05 11:43:14
在生成令牌和验证令牌时,请使用相同的对称密钥。从您共享的代码中,在生成令牌时,您使用签名密钥作为"1234..“但是,在startup.cs中验证时,您使用的是"ab de.“。这就是为什么,它抱怨签名是无效的,因为双方的密钥不匹配。
此外,请将密钥存储在安全配置文件中。如果是实时的,请使用非对称密钥(公钥和私钥)
https://stackoverflow.com/questions/61621440
复制相似问题