c# - 可以在 BEARER 授权 header 中嵌入用户名吗?

标签 c# jwt webapi

我有一个使用 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/

相关文章:

c# - 将 0.0 转换为 double 有什么问题?

c# - .net 核心 : Invalid property identifier character: {. 路径 'Logging',第 10 行,位置 2。Newtonsoft.Json.JsonTextReader.ParseProperty()

asp.net-web-api - JwtBearerAuthenticationOptions 不包含 IssuerSecurityTokenProviders 的定义

c# - Asp.Net Core 3 Identity - 来自浏览器的 JWT 中不存在自定义声明

javascript - 如何在axios中配置授权承载 token ?

c# - 在 .NET 远程处理中,RemotingConfiguration.RegisterWellKnownServiceType 和 RemotingServices.Marshal 之间有什么区别?

c# - 通用 SqlDataReader 到对象映射器

c# - 图像不显示 Xamarin.Forms

javascript - 当包含 ice 服务器时,WebRTC 卡在连接状态(远程候选甚至通过 LAN 引起问题)

c# - 在Controller Web API中创建自定义错误401响应