在 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 添加声明会公开令牌中的子项。
试一试,看看是否有效。
我有一个 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 添加声明会公开令牌中的子项。
试一试,看看是否有效。