Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我';我在Asp.NETCore中使用JWT获得了401授权?_C#_Asp.net Core_Jwt_Http Status Code 401 - Fatal编程技术网

C# 为什么我';我在Asp.NETCore中使用JWT获得了401授权?

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

我正在尝试使用JsonWebTokens(JWT)在Asp.NETCore中进行用户身份验证

当我在我的应用程序中运行登录方法时,会正确生成令牌,但是,当我尝试转到受
[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签名,但是错误仍然存在。谢谢你的回答!我已经做了相同的标记我已经在控制器的启动中添加了相同的签名,但是错误仍然存在。谢谢你的回答!我已经在控制器的启动中添加了相同的签名,但是错误仍然存在