在哪里存储访问令牌?

时间:2015-06-01 12:52:13

标签: c# .net rest session asp.net-web-api

我正在构建一个RESTful web api。用户通过身份验证和授权后,将获得一个访问令牌,其中包含:

  • USER_ID
  • 时间戳
  • 权限

我的问题是,如果使用对称算法加密这些令牌并将其传递给客户端更好,或者只是传递指向我session table中用户会话的唯一哈希值。所以基本上:

存储在客户端的令牌 - 当服务器收到令牌时,它正被解密,所有数据都在内存中。

有关会话的数据存储在数据库中,客户端收到散列 - 当服务器收到散列时,会在数据库中查找会话数据并从中获取。

哪种解决方案更适合大型服务,处理数百万用户?

2 个答案:

答案 0 :(得分:1)

从可伸缩性的角度来看,最好是生成包含信息的令牌,在服务器上签名,然后将其传递回客户端以存储并返回每个请求。通过在服务器上对其进行签名,您可以免受用户篡改数据的影响。唯一的要求是您所在地区的所有服务器都有相同的密钥来签名并检查令牌上的签名。

这样做有一个标准,称为JSON Web Tokens,它在几乎所有框架中都有实现,包括support in .NET from Microsoft

答案 1 :(得分:0)

就个人而言,我会发回令牌。但我不会依赖令牌来提供信息;而是我将它用作哈希来再次获取特定用户的信息。

缓存应该能够解决任何性能问题。

我这样做的原因与你的两个选择相反:

  1. 如果令牌包含有关身份验证和授权的信息,则可以在客户端对其进行操作。所有人都需要的是解密密钥。最好在服务器上获取(并验证)这些信息,这些信息很难操作。
  2. 会话始终会对性能产生影响,因此我建议您避免使用它。此外,使用会话可以在开发网站时鼓励一些“坏”做法(例如,在会话中存储太多或一切,使用会话来解决设计缺陷等)。