.Net Core Web API User.Identity.Name为空

时间:2018-12-12 18:56:13

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

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

        [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,但是我无法直接通过Claims来检索User.Identity

enter image description here

为什么我的User.Identity.Name在成功添加了声明后仍在此处为空?

1 个答案:

答案 0 :(得分:0)

好像我需要添加声明:

new Claim(ClaimTypes.Name, email)

仅使用:

new Claim(JwtRegisteredClaimNames.Email, email)

没有将身份声明与身份挂钩

此添加项是在我的BuildJwtToken(string email)方法中。现在一切都已正确连接。希望这对以后的人有帮助