【问题标题】:.Net Core Web API User.Identity.Name is null [duplicate].Net Core Web API User.Identity.Name 为空 [重复]
【发布时间】:2019-05-13 22:44:50
【问题描述】:

目前有一个问题,我正在尝试检索当前登录用户的名称。我的登录方法调用一个令牌管理器,它构建令牌并添加适当的声明。见下文:

        [HttpPost]
        [Route("Login")]
        public async Task<IActionResult> Login([FromBody] TokenViewModel vm)
        {
            try
            {
                if (!ModelState.IsValid)
                {
                    return BadRequest();
                }

                var user = await _userManager.FindByEmailAsync(vm.Email);
                var isLoginRequestValid = await _userManager.CheckPasswordAsync(user, vm.Password);

                if (!isLoginRequestValid)
                {
                    return BadRequest("Username or password is incorrect");
                }

                return Ok(new TokenViewModel { Token = _tokenManager.BuildJwtToken(vm.Email) });
            }
            catch(Exception ex)
            {
                return BadRequest(ex);
            }
        }

和令牌管理器:

        public string BuildJwtToken(string email)
        {
            var claims = new[]
            {
                new Claim(JwtRegisteredClaimNames.Email, email),
                new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
            };

            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]));

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

            var token = new JwtSecurityToken(_config["Jwt:Issuer"],
                _config["Jwt:Audience"],
                claims,
                expires: DateTime.Now.AddMinutes(double.Parse(_config["Jwt:ExpireTime"])),
                signingCredentials: creds);

            return new JwtSecurityTokenHandler().WriteToken(token);
        }

我已经查看了很多关于此问题的帖子,但仍未找到解决方案。身份验证本身工作正常。此外,如果我检查User.Identity 并检查它在请求时的声明,那么我可以看到其中包含名称的声明(在这种情况下是电子邮件test@test.com)。请参阅下面的屏幕截图,其中显示第一个声明是电子邮件声明,并且包含值 test@test.com 但是我无法直接通过 User.Identity 检索 Claims:

为什么我的User.Identity.Name 尽管已经成功添加了声明,但在这里仍然为空?

【问题讨论】:

标签: .net .net-core authorization jwt asp.net-core-webapi


【解决方案1】:

看来我需要添加声明:

new Claim(ClaimTypes.Name, email)

只使用:

new Claim(JwtRegisteredClaimNames.Email, email)

不与身份声明挂钩

这个添加是在我的BuildJwtToken(string email) 方法中。现在一切都已正确连接。希望这对将来的其他人有所帮助

【讨论】:

    猜你喜欢
    • 2020-07-31
    • 2020-04-11
    • 2018-01-24
    • 2018-03-30
    • 1970-01-01
    • 2017-08-28
    • 2018-05-08
    • 2020-02-11
    • 2015-11-28
    相关资源
    最近更新 更多