问题描述
我有一个带有许多控制器的 API。这些控制器之一是身份验证控制器。它用于从该控制器或其他控制器获取 JWT 令牌并调用其他路径。
我的问题是,对于任何路径,我都需要获取 JWT 令牌中的用户 ID,并请求数据库获取有关用户的信息,例如检查用户是否存在或链接到他的数据。所以在每个方法中,我必须调用一个特定的方法来检索信息。
实际上,认证层只是为了检查 JWT Token 是否有效。不知道能不能在这一层加点逻辑。以及如何。
我想过单例,但我不确定对象的范围。目标是保持在请求范围内。
我想创建一个用户服务,但我认为这不是一个好方法,因为服务是关于处理的,而不是在其中保存数据。
目标是在同一个地方实现所有的用户逻辑,每个服务都可以调用它来处理:
Request (with JWT Token) --> Controller --> Service --> Call the object with all user's stuff and logic and treatment
or
Request (with JWT token) --> middleware (get all user's informations) --> Controller --> Call the object created in middleware with all user's stuff
public async Task<ServiceResponse<UserLoginResponseDto>> Login(ServiceRequest<UserLoginRequestDto> request)
{
ServiceResponse<UserLoginResponseDto> response = new ServiceResponse<UserLoginResponseDto>();
User user = await _context.Users.FirstOrDefaultAsync(x => x.Username.ToLower().Equals(request.Data.Username.ToLower()));
if (user == null)
{
response.Success = false;
response.Message = "User not found";
}
else if (user.IsLocked)
{
response.Success = false;
response.Message = "User locked";
}
else if (!user.IsActivated)
{
response.Success = false;
response.Message = "User not activated";
}
else if (!VerifyPasswordHash(request.Data.Password,user.PasswordHash,user.PasswordSalt))
{
response.Success = false;
response.Message = "Wrong password";
}
else
{
response.Data = _mapper.Map<UserLoginResponseDto>(user);
response.Data.JWtToken = Createtoken(user);
}
return response;
}
private string Createtoken(User user)
{
List<Claim> claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier,user.Id.ToString()),new Claim(ClaimTypes.Name,user.Username),};
SymmetricSecurityKey key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config.GetSection("AppSettings:Token").Value));
SigningCredentials creds = new SigningCredentials(key,SecurityAlgorithms.HmacSha512Signature);
SecurityTokenDescriptor tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(claims),Expires = DateTime.Now.AddDays(1),SigningCredentials = creds
};
JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();
SecurityToken token = tokenHandler.Createtoken(tokenDescriptor);
return tokenHandler.Writetoken(token);
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)