【发布时间】:2020-08-20 14:29:12
【问题描述】:
我正在尝试使用 JsonWebTokens(JWT) 在 Asp.net CORE 中进行用户身份验证。
当我在我的应用程序中运行登录方法时,令牌会正确生成,但是,当我尝试转到受 [Authorize] 属性限制的方法时,我会收到 401 未经授权的错误。
Bearer error=\"invalid_token\", error_description=\"签名无效\"
这就是我在Startup 中的ConfigureServices 方法中配置的方式:
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);
}
我正在用邮递员测试这个,我已经添加了相应的标题。
非常感谢您花时间看这个!
【问题讨论】:
-
您是否尝试在您的令牌前面的标头中添加“Bearer”字样?
-
@xray 错误表示签名无效,这意味着令牌即将到达服务器,但它没有有效的签名。仔细看代码,这里的key不匹配。
-
什么@PrateekKumarDalbehera 我相信它朝着正确的方向发展。我相信他说的是: SymmetricSecurityKey(Encoding.UTF8.GetBytes("1234567890123456") 这与 configureservices 中的内容不同
-
嗨,谢谢你的提问!
-
我已经在启动时添加了与控制器相同的签名,但错误仍在继续,是的,在测试中的令牌前添加单词 Bearer
标签: c# asp.net-core jwt http-status-code-401