简体   繁体   English

ASP.NET 项目中的 JWT 身份验证

[英]JWT Authentication in ASP.NET Project

I am Trying to extract the Id from JWT Token .我正在尝试从JWT Token中提取 Id。

Controller Code: Controller 代码:

public async Task<IActionResult> GetUser(string id)
        {
            var currentUserId = (User.FindFirst(ClaimTypes.NameIdentifier).Value);  //Line number: 27
            bool isCurrentUser = String.Equals(currentUserId, id);
            var user = await _repo.GetUser(id, isCurrentUser);
            var userToReturn = _mapper.Map<UserForDetailed>(user);
            return Ok(userToReturn);
        }

But this shows a run time error.但这显示了运行时错误。

If I remove.Value (commented line) (User.FindFirst(ClaimTypes.NameIdentifier) it returns null but no error.如果我 remove.Value (注释行) (User.FindFirst(ClaimTypes.NameIdentifier)它返回 null 但没有错误。

来自 Postman 的错误堆栈 来自 VS Code 的错误堆栈 Both error messages are identical两个错误消息是相同的

Startup.cs:启动.cs:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddJwtBearer(options =>
                {
                    options.TokenValidationParameters = new TokenValidationParameters
                    {
                        ValidateIssuerSigningKey = true,
                        IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration
                        .GetSection("AppSettings:Token").Value)),
                        ValidateIssuer = true,
                        ValidateAudience = true
                    };
                });

Method that generate JWT token:生成 JWT 令牌的方法:

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),
                new Claim(ClaimTypes.Email, user.Email)
            };

            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(7),
                SigningCredentials = creds
            };

            var tokenHandler = new JwtSecurityTokenHandler(); 
            var token = tokenHandler.CreateToken(tokenDescriptor);

            return tokenHandler.WriteToken(token);
        }

I like to mention, another project where I used the same method, it works.我想提一下,另一个我使用相同方法的项目,它有效。

public async Task<IActionResult> GetUser(int id)
        {
            var isCurrentUser = int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value) == id;
            var user = await _repo.GetUser(id, isCurrentUser);
            var userToReturn = _mapper.Map<UserForDetailed>(user);
            return Ok(userToReturn);
        }

Difference is, one have id: string another id: int不同的是,一个有 id: string 另一个 id: int

Please let me know, If you need any additional Info请让我知道,如果您需要任何其他信息

Edit: Example Token: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJuYW1laWQiOiIwMDMzMmVlMy1lZmVlLTRiOTctYTQ5ZS04ODRhYmJhOGE0NzciLCJ1bmlxdWVfbmFtZSI6InJhanUiLCJlbWFpbCI6InJhanVAZ21haWwuY29tIiwicm9sZSI6WyJkZXYiLCJtYW0iXSwibmJmIjoxNTk0NDk1NTA2LCJleHAiOjE1OTUxMDAzMDYsImlhdCI6MTU5NDQ5NTUwNn0.wvfOst-3lMk0d1-LafzuXKzeC_yN2ZQL3GSsZ5114IukOfwipNnTaFm-RlTbu52KesuRl4NyWiHoEt5IR0n7EQ Edit: Example Token: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJuYW1laWQiOiIwMDMzMmVlMy1lZmVlLTRiOTctYTQ5ZS04ODRhYmJhOGE0NzciLCJ1bmlxdWVfbmFtZSI6InJhanUiLCJlbWFpbCI6InJhanVAZ21haWwuY29tIiwicm9sZSI6WyJkZXYiLCJtYW0iXSwibmJmIjoxNTk0NDk1NTA2LCJleHAiOjE1OTUxMDAzMDYsImlhdCI6MTU5NDQ5NTUwNn0.wvfOst-3lMk0d1-LafzuXKzeC_yN2ZQL3GSsZ5114IukOfwipNnTaFm-RlTbu52KesuRl4NyWiHoEt5IR0n7EQ

Payload of Decoded Token:解码令牌的有效载荷: 解码令牌

Edited:编辑:

Your token does not seem to have a Sub claim which will be mapped to ClaimTypes.NameIdentifier (aka http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier )您的令牌似乎没有将映射到ClaimTypes.NameIdentifierSub声明(又名http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier

Also, I hope you are saving the token in the AppSettings just for testing purposes, because Tokens are meant to be expired.另外,我希望您将令牌保存在 AppSettings 中只是为了测试目的,因为令牌意味着过期。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM