.net core 在邮递员在提供无效令牌后使用.Net Core标识获得401未经授权后,我是否拥有正确的令牌?

.net core 在邮递员在提供无效令牌后使用.Net Core标识获得401未经授权后,我是否拥有正确的令牌?,.net-core,jwt,postman,identity,.net Core,Jwt,Postman,Identity,不确定我的令牌为什么无效。我用Postman调用login()获取它,然后将它粘贴到JWT.io中,它显示“无效签名” 我可以将我的密钥粘贴到JWT.io中,它将进行验证,但这似乎不对,因为它会将令牌更改为与我的登录方法返回给用户的内容不同的内容! 这是我的令牌,密钥是“超级密钥”。当粘贴到JWT.io中时,该标记可能有效 EyjhbgcioijiuzuxmiiiIKpxvcj9.EyjuyjuijuiijijijijijujIKyndqsimlhdc0.UAU66YKdJ01mQbooxivz

不确定我的令牌为什么无效。我用Postman调用login()获取它,然后将它粘贴到JWT.io中,它显示“无效签名” 我可以将我的密钥粘贴到JWT.io中,它将进行验证,但这似乎不对,因为它会将令牌更改为与我的登录方法返回给用户的内容不同的内容! 这是我的令牌,密钥是“超级密钥”。当粘贴到JWT.io中时,该标记可能有效

EyjhbgcioijiuzuxmiiiIKpxvcj9.EyjuyjuijuiijijijijijujIKyndqsimlhdc0.UAU66YKdJ01mQbooxivzQdJnqNqNqZc2JT1QUYFDC9N5N5LqpjRac3NqHqW8BhzZc2NqNqNq2JT1NqYFjRqHzZc2NqLqHqLqHzZc2JJJJJJJJJJJJJJNqL3ShZc0-ShZcHzW8

这里是我粘贴我的密钥以验证令牌的地方

然后,我创建一个新的Postman get查询来获取一些值,并使用从登录返回的令牌。但是我没有得到授权

我在postman中添加了这样的令牌(与登录发送给我的令牌相同,而不是经过验证后更改的令牌)

我还向启动文件中添加了“IdentityModelEventSource.ShowPII=true;”,以显示其他调试,这里是“我在调试控制台中看到的”

Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler 验证令牌失败。 Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException:IDX10503:签名验证失败。尝试的密钥:“Microsoft.IdentityModel.Tokens.SymmetricSecurityKey,密钥ID: '. 捕获的异常: ''. 令牌:{“alg”:“HS512”,“typ”:“JWT”}.{“nameid”:“1”,“unique_name”:“chuck”,“role”:[“Member”,“Admin”],“nbf”:1579159444,“exp”:1579245844,“iat”:1579159444}

如果要求,我可以粘贴我的令牌生成代码。 如果您能解释一下这里发生了什么,我们将不胜感激。 问题-我错过了一步吗?我是否提供登录将我发送回授权控制器方法的相同令牌或更改的令牌(两者都尝试过)

下面是我用来创建令牌的代码

    private async Task<string> GenerateJwtToken(User user)
    {
        var claims = new List<Claim>
        {
            new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
            new Claim(ClaimTypes.Name, user.UserName)
        };

        var roles = await _userManager.GetRolesAsync(user);

        foreach (var role in roles)
        {
            claims.Add(new Claim(ClaimTypes.Role, role));
        }

        var key = new SymmetricSecurityKey(Encoding.UTF8
            .GetBytes(_config.GetSection("AppSettings:Token").Value));

        var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha512Signature);

        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(claims),
            Expires = DateTime.Now.AddDays(1),
            SigningCredentials = creds
        };

        var tokenHandler = new JwtSecurityTokenHandler();

        var token = tokenHandler.CreateToken(tokenDescriptor);

        return tokenHandler.WriteToken(token);
    }
专用异步任务GenerateJwtToken(用户)
{
var索赔=新列表
{
新声明(ClaimTypes.NameIdentifier,user.Id.ToString()),
新索赔(ClaimTypes.Name、user.UserName)
};
var roles=await\u userManager.GetRolesAsync(用户);
foreach(角色中的var角色)
{
添加(新索赔(ClaimTypes.Role,Role));
}
var key=new SymmetricSecurityKey(Encoding.UTF8
.GetBytes(_config.GetSection(“AppSettings:Token”).Value));
var creds=新的签名凭证(key,SecurityAlgorithms.HmacSha512Signature);
var tokenDescriptor=新的SecurityTokenDescriptor
{
主题=新的索赔实体(索赔),
Expires=DateTime.Now.AddDays(1),
签名凭证=信誉
};
var tokenHandler=new JwtSecurityTokenHandler();
var token=tokenHandler.CreateToken(tokenDescriptor);
返回tokenHandler.WriteToken(令牌);
}
我添加了

app.Authentication()

要启动并工作…

当您粘贴密钥时在hwt.io中更新令牌时,该密钥与用于签名令牌的密钥不同。您确定后端使用相同的机密进行签名和验证吗?一旦在我的应用程序上,服务器就从每个请求中删除了授权标头。您可以从任何公共函数转储请求头,并查看头标记是否设置正确。jps-我不确定我是否理解您的问题。我知道当我添加密钥时令牌会发生变化。但是我不知道如何回答您关于签名和验证的问题。@user1186050:当您拥有正确的密码(用于签名令牌的密码)时,您应该不会在jwt.io上看到签名的更改。我的问题是,你从服务器得到一个令牌,这个令牌被签名。所以服务器使用了某种秘密来签名。稍后,您发出一个请求,并得到一个错误,说明签名无效。当您发送从服务器获得的原始令牌时,应该没有问题。如果出现问题,服务器可能会在验证期间使用不同的密码。好的,所以当我添加密码时,我确实在JWT.io中看到了令牌的更改。那么糟糕吗?但另一个问题是,在我下面的视频教程中,讲师根本没有添加秘密,而且它是有效的,他可以将其传递给控制器并进行正确的身份验证。我只是想知道,是否有不同版本的身份和他使用的可能是一个问题?