在 BEARER Authorization Header 中嵌入用户名可以吗?

Is it okay to embed username in BEARER Authorization Header?

我有一个 API 使用 Web API 创建的端点来创建安全令牌。因此,用户在基本授权 header 中传递 username:password。 username/password 已验证并返回 Json Web 令牌。

现在,我将执行 GET 或 POST 的所有其他端点作为 BEARER 类型在授权 header 中传递 JWT。我知道通常这是 BEARER + (jwt) 但是否可以通过 BEARER + 用户名:(jwt)

我想传递用户名:(jwt) 的原因是当我验证 jwt 我也想从 jwt 声明中提取用户名并将其与 auth 中传递的用户名进行比较 header作为额外检查。

这种方法听起来不错,还是我应该完全忘记进行用户名检查,因为它不会增加任何额外的安全性?

您可以在 sub 声明中发送 username/userid。

令牌内的声明已签名。 username/userid(sub) 已签名,无需验证 username/userid 是否为 ok/valid。

在你的例子中 BEARER Username:Token

用户名(未签名,可更改,不可验证):

Token(claims/header/signature - 所有内容为signed/validated)>

Username/userid 外部令牌不增加额外的安全性。

System.IdentityModel.Tokens.Jwt.JwtRegisteredClaimNames.Sub 以避免在声明名称中写“sub”。此命名空间位于 System.IdentityModel.Tokens.Jwt nuget 包中。

没有什么可以阻止您在令牌之外添加用户名,但是 您可以根据需要向您的令牌添加任意数量的声明,并且可以包括用户名。可以通过 IHttpContextAccessor 从您的客户端应用程序或 Web API 检索这些声明。

在您的 client/API 中,您可以执行类似这样的操作来检索声明:

List<Claim> claims = _context.Request.HttpContext.User.Claims.ToList(); 

其中 _context 是 IHttpContextAccessor 类型。

这将获得您的编码令牌的主题 属性,它是一个 ClaimsIdentity,由创建您的令牌时添加的声明列表组成。

您可以在令牌之外添加用户名,但是在 client/API 对不记名令牌进行身份验证后,您需要的一切都可以更安全地存储并从令牌本身检索。

此外,您可以在访问 client/API 中的其他 类 时使用声明来添加额外授权。

所有其他声明类型(如 sub、iat 等)在您的 client/API 端经过身份验证后都是令牌中的属性。在令牌创建期间您需要做的是使用 SecurityTokenDescriptor 创建令牌描述符,如下所示(缩写):

SecurityTokenDescriptor descriptor = new SecurityTokenDescriptor
{
    Subject = new ClaimsIdentity(new[] {
        new Claim(ClaimTypes.Name, username),
        new Claim(JwtRegisteredClaimNames.Sub, username)}),
    Expires = DateTime.Now.AddMinutes(expiration_in_minutes),
    SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key),
      SecurityAlgorithms.HmacSha256Signature)
};

您需要确保命名空间在您的源代码中:

using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;

当我运行生成token然后在get:

中解码https://jwt.io/中的token
{
  "unique_name": "usernam@xxxx.xxx",
  "sub": "usernam@xxxx.xxx",
  "nbf": 1622285741,
  "exp": 1622287503,
  "iat": 1622285741
}

使用 JwtRegisteredClaimNames.Sub 添加声明会公开令牌中的子项。

试一试,看看是否有效。