C# 为什么我';我在Asp.NETCore中使用JWT获得了401授权?
我正在尝试使用JsonWebTokens(JWT)在Asp.NETCore中进行用户身份验证 当我在我的应用程序中运行登录方法时,会正确生成令牌,但是,当我尝试转到受C# 为什么我';我在Asp.NETCore中使用JWT获得了401授权?,c#,asp.net-core,jwt,http-status-code-401,C#,Asp.net Core,Jwt,Http Status Code 401,我正在尝试使用JsonWebTokens(JWT)在Asp.NETCore中进行用户身份验证 当我在我的应用程序中运行登录方法时,会正确生成令牌,但是,当我尝试转到受[Authorize]属性限制的方法时,会出现401个未经授权的错误 承载错误=\“无效\u令牌\”,错误\u描述=\“签名无效” 这就是我在Startup中的ConfigureServices方法中的配置方式: services.AddAuthentication(x => { x.D
[Authorize]
属性限制的方法时,会出现401个未经授权的错误
承载错误=\“无效\u令牌\”,错误\u描述=\“签名无效”
这就是我在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
};
});
app.UseAuthentication();
这就是我在启动中配置的方式:
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
};
});
app.UseAuthentication();
这是在登录控制器中生成的令牌:
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测试这个,我已经添加了相应的标题
非常感谢您抽出时间来看这个 令牌中的键
与配置中的设置不匹配。它们必须完全匹配。令牌中的键与配置中的设置不匹配。它们必须完全匹配。请在生成令牌和验证令牌时使用相同的对称密钥。根据您共享的代码,在生成令牌时,您使用的签名密钥为“1234..”,但在startup.cs中进行验证时,您使用的是“ab de..”。这就是为什么,它抱怨签名无效,因为两个密钥不匹配
此外,请将密钥存储在安全配置文件中。如果是实时的,请使用非对称密钥(公钥和私钥)请在生成令牌和验证令牌时使用相同的对称密钥。根据您共享的代码,在生成令牌时,您使用的签名密钥为“1234..”,但在startup.cs中进行验证时,您使用的是“ab de..”。这就是为什么,它抱怨签名无效,因为两个密钥不匹配
此外,请将密钥存储在安全配置文件中。如果是实时的,请使用非对称密钥(公钥和私钥)您是否尝试在您的令牌前面的标题中添加“Bearer”字?@xray错误表示签名无效,这意味着令牌将到达服务器,但它没有有效的签名。在这里,如果你仔细看代码,键是不匹配的。我相信他说的是:SymmetricSecurityKey(Encoding.UTF8.GetBytes(“1234567890123456”),这与configureservicesHey中的内容不同,谢谢你的提问!我已经在控制器的启动中输入了相同的签名,但错误仍然存在,是的,在测试中的令牌之前添加单词Bearer你尝试添加了吗“持票人"您的令牌前面的单词,在标题中?@X射线错误表明签名无效,这意味着令牌将进入服务器,但它没有有效的签名。在这里,如果您仔细查看代码,密钥不匹配。我相信@Pratekkumardalbehera的方向是正确的。我相信他说的是:SymmetricSecurityKey(Encoding.UTF8.GetBytes(“1234567890123456”)这与ConfigureServicesEy中的内容不同,谢谢您的提问!我已经在控制器的启动中输入了相同的签名,但错误仍然存在,是的,在测试中的令牌之前添加单词Bearer嘿,谢谢您的回答!我已经在控制器的启动中输入了相同的签名,但错误是或者继续你应该编辑你的问题而不是发布答案。将你的签名算法更改为Hmac256
。嘿,谢谢你的建议!我已经这样做了,我也继续将HmacSha256替换为HmacSha256签名,但错误继续。谢谢你的回答!我已经在startu中添加了相同的签名你应该编辑你的问题而不是发布答案。将你的签名算法更改为Hmac256
。嘿,谢谢你的建议!我已经这样做了,我也继续将HmacSha256而不是HmacSha256签名,但是错误仍然存在。谢谢你的回答!我已经做了相同的标记我已经在控制器的启动中添加了相同的签名,但是错误仍然存在。谢谢你的回答!我已经在控制器的启动中添加了相同的签名,但是错误仍然存在