从 JWT 令牌获取我所有服务中用户信息的模式

问题描述

我有一个带有许多控制器的 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

有关信息,有我的登录方法和我创建 JWT 令牌的方式:

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 (将#修改为@)