当前位置: 首页 > 知识库问答 >
问题:

在BEARER授权头中嵌入用户名可以吗?

岳浩宕
2023-03-14

我有一个使用Web API创建安全令牌的APIendpoint。因此,用户在基本授权头中传递username:password。验证用户名/密码并返回Json Web令牌。

现在,我所有其他执行GET或POST的endpoint都将作为BEARER类型在Authorization头中传递JWT。我知道这通常是BEARER(jwt),但传递BEARER用户名(jwt)也可以吗

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

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

共有2个答案

袁赞
2023-03-14

您可以在子索赔中发送用户名/用户ID。

令牌内的声明已签名。用户名/用户ID(sub)已签名,无需验证用户名/用户ID是否正常/有效。

在您的情况下,持有者用户名:令牌

用户名(无签名,可以更改,无法验证):

令牌(声明/标头/签名-所有内容都经过签名/验证)

令牌外部的用户名/用户 ID 不会增加额外的安全性。

系统标识模型标记Jwt.Jwt注册索赔名称。Sub以避免在索赔名称中写入“Sub”。此命名空间位于System.IdentityModel.Tokens中。Jwt nuget包。

柯天宇
2023-03-14

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

然后,在客户端/API 中,您可以执行以下操作来检索声明:

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

其中_context的类型为 IHttpContextAccessor。

这将获取编码令牌的 Subject 属性,该属性是一个 ClaimsIdentity,由创建令牌时添加的声明列表组成。

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

此外,当访问客户端/API中的其他类时,可以使用声明来添加额外的授权。

所有其他声明类型(如 sub、iat 等)都是在客户端/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;

当我运行这个来生成令牌,然后在get中用https://jwt.io/解码令牌时:

{
  "unique_name": "usernam@xxxx.xxx",
  "sub": "usernam@xxxx.xxx",
  "nbf": 1622285741,
  "exp": 1622287503,
  "iat": 1622285741
}

使用JwtRegisteredClaimNames添加声明。Sub公开令牌中的sub。

试试看它是否有效。

 类似资料:
  • 我正在使用令牌式认证过程。客户端获得令牌后,它或者被设置在客户端的cookies中(对于Web),或者被设置在客户端请求的授权头中(对于移动设备)。但是,为了获得有效的令牌,客户端必须首先使用有效的用户名/密码组合“登录”。我的问题是: 通过在授权标头中发送用户名/密码组合与作为请求的JSON正文中的参数(假设我使用的是HTTPS)是否有任何额外的安全性? 我只需要在每次会话中发送用户名/密码组合

  • 例如,当我有一个post方法-登录时,我得到了签名的JSON Web令牌。我在youtube上看了一些教程,当他们检查用户是否被授权时,他们会在授权标头中发送JWT,例如: 不记名令牌 我的问题是:当同样的事情在工作时,如果我们只发送授权标头中的令牌,而没有令牌前面的“持有人”,他们为什么要这样做?

  • 介绍 除了内置的 用户认证 服务之外, Lumen 还提供了用户授权和资源访问控制的方案。有很多种方法与辅助函数能帮你处理授权逻辑。 总的来说,Lumen 中的使用和 Laravel 大同小异,我们会在这个文档中指出不同的地方,完整的用户授权文档还需要查阅 Laravel 授权文档 。 与 Laravel 的不同 定义权限 与 Laravel 相比,Lumen 的用户授权的不同之处在于如何定义权限

  • 我已经使用IWebBrowser2控件实现了oAuth2隐式授权流,身份验证对话框从openAM中出现,我已经输入了用户名和密码,它为我提供了访问令牌。但是我的应用程序如何知道哪个用户名是经过身份验证的,我还需要从我的数据库中验证这个用户名?

  • 问题内容: 我一直在尝试使用axios向National Park Service API发出GET请求,并尝试了几种方法将请求标头中的API密钥设置为无效。任何帮助将不胜感激。 我努力了: 和 都返回401。当我在Postman中发送GET请求时工作,我在密钥字段中输入Authorization,在值字段中输入我的API密钥。 谢谢。 问题答案: 此问题是由浏览器中的CORS OPTIONS请求

  • 主要内容:权限类型说明授权就是为某个用户赋予某些权限。例如,可以为新建的用户赋予查询所有数据库和表的权限。MySQL 提供了 GRANT 语句来为用户设置权限。 在 MySQL 中,拥有 GRANT 权限的用户才可以执行 GRANT 语句,其语法格式如下: 其中: priv_type 参数表示权限类型; columns_list 参数表示权限作用于哪些列上,省略该参数时,表示作用于整个表; database.table