我应该将用户声明存储在JWT令牌中吗?


18

我在HTTP标头中使用JWT令牌来验证对资源服务器的请求。资源服务器和身份验证服务器是Azure上的两个单独的辅助角色。

我不能决定应该将请求存储在令牌中还是将请求附加到请求/响应中。Claims列表影响客户端UI元素的呈现以及对服务器上数据的访问。因此,在处理请求之前,我想确保服务器收到的声明是真实的并经过验证的。

声明示例包括:CanEditProductList,CanEditShopDescription,CanReadUserDetails。

我要为其使用JWT令牌的原因是:

  • 更好地防止客户端对声明进行编辑(即入侵声明列表)。
  • 无需在每个请求上查找索赔。

我不想使用JWT令牌的原因:

  • 然后,身份验证服务器必须知道以应用程序为中心的声明列表。
  • 令牌成为黑客入侵的单一点。
  • 我读过几句话说,JWT令牌不用于应用程序级数据。

在我看来,两者都有缺点,但是我倾向于将这些声明包含在令牌中,并且只想由以前处理过此问题的人员来处理。

注意:我将对所有API请求使用HTTPS,因此在我看来,令牌将“足够”安全。我正在使用AngularJS,C#,Web API 2和MVC5。


现在阅读...。如果可以的话,希望获得更新。我将对您所做的事情感兴趣,因为我正面临着同样的问题。思考,而我却错过了某些部分的工作方式。用户获得了授权令牌,但随后声明将如何进行……您能否解释您的发现……可能会帮助我。
Seabizkit,

Answers:


7

我仅将标识符声明(用户ID等)(加密)存储在我的jwt中。

然后,当我在服务器(API)上获得令牌时,我可以进行查找服务器端(数据库或本地网络api调用)并检索与该用户ID的所有关联(应用程序,角色等)。

但是,如果您想在jwt中填充更多内容,请小心大小,因为它可能会在每个请求中发送,但请确保对敏感的声明数据进行加密。


干杯,DL。您是将角色等缓存在API服务器上,还是每次收到请求时仅两次访问数据库?(即一次用于角色,一次用于请求的实际数据)。如果您缓存它,我很想知道您使用哪种方法。另外,您是说要进一步在已经加密的令牌“内”加密用户ID吗?谢谢。
Astravagrant 2015年

1
我尚未深入实现:),但是是的,我正在考虑使用高速缓存服务器,这样我就不会经常访问数据库,并且如果角色发生更改,可以删除高速缓存以允许新的查询要加载的角色保存的缓存。就我而言,我可能会使用基于开放式memcached的Amazon AWS elsticache,但更易于配置和使用。
wchoward

我还认为最好在资源服务器上获取所有必要信息,而不是将其存储在令牌中。
MateuszMigała16年

因此,对于每个请求,您都可以获得用户的角色...要求...,您能否指出我的文章或其他内容,以证明这是可行的。当前正在使用会话,但是正在寻找一种更好的处理方式,但是对每个请求的查找都不对吗?
Seabizkit,

3

听起来好像身份验证(用户是谁)和授权(允许用户执行的操作)没有像您想要的那样清晰划分。

如果您不希望身份验证服务器知道用户有权获得的权限,则可以像wchoward建议的那样,将该JWT中的声明限制为该用户ID。您可以让另一个服务器(称为授权服务器)查找用户有权获得的权限。

当客户端首次向其提供身份验证令牌时,授权步骤可以由资源服务器完成。然后,资源服务器将向客户端发送包含授权声明的令牌。

注意:两个JWT应该由不同的密钥签名。

优点:

  • 认证和授权是分开管理的。
  • 资源服务器不必在每个请求上都查找授权。
  • 用户界面有权查看授权,但不能对其进行编辑。

缺点:

  • 客户端需要处理两个令牌而不是一个。
  • 添加授权服务器将增加另一个要管理的部分。

1
不要忘记,即使您在UI中检查授权,当请求到达时,仍然必须在服务器端检查授权。
乍得·克拉克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.