我有一个使用 Web API 创建的 API 端点来创建安全 token 。因此,用户在基本授权 header 中传递用户名:密码。用户名/密码经过验证并返回 Json Web token 。
现在,我所有其他执行 GET 或 POST 的端点都将在 Authorization header 中将 JWT 作为 BEARER 类型传递。我知道通常这是 BEARER + (jwt) 但通过也可以吗 BEARER + 用户名:(jwt)
我想传递用户名的原因:(jwt) 是当我验证 jwt 时,我还想从 jwt 声明中提取用户名,并将其与 auth header 中传递的用户名进行比较,作为额外检查。
这种方法听起来不错,还是我应该完全忘记进行用户名检查,因为它没有增加任何额外的安全性?
最佳答案
但是,没有什么可以阻止您在 token 之外添加用户名 您可以根据需要向 token 添加任意数量的声明,并且可以包含用户名。可以通过 IHttpContextAccessor 从您的客户端应用程序或 Web API 检索这些声明。
在您的客户端/API 中,您可以执行以下操作来检索声明:
List<Claim> claims = _context.Request.HttpContext.User.Claims.ToList();
其中 _context 的类型为 IHttpContextAccessor。
这将获取编码 token 的主题属性,该属性是一个 ClaimsIdentity,由创建 token 时添加的声明列表组成。
您可以在 token 之外添加用户名,但是在客户端/API 对不记名 token 进行身份验证后,您需要的所有内容都可以更安全地存储并从 token 本身检索。
此外,您可以在访问客户端/API 中的其他类时使用声明添加额外授权。
所有其他声明类型(例如 sub、iat 等)在客户端/API 端经过身份验证后都是 token 内的属性。在 token 创建过程中,您需要做的是使用 SecurityTokenDescriptor 创建 token 描述符,如下所示(缩写):
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 ,然后在 https://jwt.io/ 中解码 token 时在获取:
{
"unique_name": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4d383e283f232c200d3535353563353535" rel="noreferrer noopener nofollow">[email protected]</a>",
"sub": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="bbcec8dec9d5dad6fbc3c3c3c395c3c3c3" rel="noreferrer noopener nofollow">[email protected]</a>",
"nbf": 1622285741,
"exp": 1622287503,
"iat": 1622285741
}
使用 JwtRegisteredClaimNames.Sub 添加声明会公开 token 中的 sub。
尝试一下,看看是否有效。
关于c# - 可以在 BEARER 授权 header 中嵌入用户名吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67745347/