使用每个用户的密钥而不是应用程序范围的密钥签署 JWT 令牌

时间:2021-06-09 21:22:24

标签: jwt

通常,JWT 令牌使用应用程序范围的秘密非对称密钥对进行签名。但是,我正在集成到一个使用每用户密码的系统中,该密码实际上是用户表中密码的盐(在那里称为 private_key)。

我觉得这个系统有点奇怪。这显然是为了确保如果用户更改了他的密码,颁发的令牌将停止工作。但它确实扼杀了 JWT 的主要优势:让任何其他系统都能够接受令牌而无需调用 Auth 服务来验证它。在这种情况下,解码令牌需要在未经验证的情况下对其进行解码,获取数据库用户/私钥,然后对其进行验证。

.net 代码:

List<Claim> claims = new List<Claim>()
{
    new Claim("UserUUID", user.UserUUID.ToString())
};

var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(user.PrivateKey));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

var token = new JwtSecurityToken(
    issuer: _configuration["JwtIssuer"],
    audience: _configuration["JwtIssuer"],
    claims: claims,
    expires: expirationDate,
    signingCredentials: creds);

return Ok(new
{
    access_token = new JwtSecurityTokenHandler().WriteToken(token),
    expires_on = expirationDate
});

这实际上是否合理?如果存在验证问题以外的问题,为什么不好?

我见过a similar question,但它没有说明这个方案是好主意、坏主意还是无用的负担。

0 个答案:

没有答案