gpt4 book ai didi

c# - 从 ASP.NET CORE 2 获取当前用户

转载 作者:行者123 更新时间:2023-11-30 21:34:38 24 4
gpt4 key购买 nike

我在我的应用程序中创建更新用户,然后我在 Postman 和 Web App 中测试了我的应用程序,但产生了不同的结果。当我在 postman 中尝试此代码时它可以工作但网络应用程序不起作用(ASP.NET CORE 2.0 中的代码,使用 Angular 5 的 Web 应用程序)

[HttpPut("{id}")]
public async Task<IActionResult> UpdateUser(int id, [FromBody] UserForUpdateDto userDto) {
if(!ModelState.IsValid)
return BadRequest(ModelState);

var currentUserId = int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value);
var userFromRepo = await _orgRepo.GetUser(id);
if(userFromRepo == null)
return NotFound($"User not found with id: {id}");
if (currentUserId != userFromRepo.Id)
return Unauthorized();

_mapper.Map<UserForUpdateDto, User>(userDto, userFromRepo);

if (await _orgRepo.SaveAll())
return NoContent();

throw new Exception($"Updating user {id} failed on save");
}

它从 WebApp 产生错误:“对象引用未设置到对象的实例。”

当我调试应用程序时,似乎是线路导致的

var currentUserId = int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value);

我检查了一下,结果为空。

知道用户是在哪里设置的吗?

我的登录 Controller :

[HttpPost("login")]
public async Task<IActionResult> Login([FromBody]UserForLoginDto userForLoginDto)
{
var userFromRepo = await _repo.Login(userForLoginDto.Username.ToLower(), userForLoginDto.Password);

if (userFromRepo == null)
return Unauthorized();

// generate token
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes(_config.GetSection("AppSettings:Token").Value);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[]
{
new Claim(ClaimTypes.NameIdentifier, userFromRepo.Id.ToString()),
new Claim(ClaimTypes.Name, userFromRepo.Username),
new Claim(ClaimTypes.Role, "RegisteredUsers")
}),
Expires = DateTime.Now.AddDays(3),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key),
SecurityAlgorithms.HmacSha512Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
var tokenString = tokenHandler.WriteToken(token);

var user = _mapper.Map<UserForDetailDto>(userFromRepo);
return Ok(new { tokenString, user });

}

最佳答案

如果 api 方法包含 [Authorize],则授权 header 随请求一起发送。如果没有发送 header ,那么您就没有用户。

[HttpPut("{id}")]
[Authorize(AuthenticationSchemes = "Bearer")]
public async Task<IActionResult> UpdateUser(int id, [FromBody] UserForUpdateDto userDto)
{
var sub = User.GetSubjectId(); // Subject Id is the user id
}

关于c# - 从 ASP.NET CORE 2 获取当前用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49973251/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com