Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在哪里存储访问令牌?_C#_.net_Rest_Session_Asp.net Web Api - Fatal编程技术网

C# 在哪里存储访问令牌?

C# 在哪里存储访问令牌?,c#,.net,rest,session,asp.net-web-api,C#,.net,Rest,Session,Asp.net Web Api,我正在构建一个RESTfulWebAPI。一旦用户经过身份验证和授权,他们将获得一个访问令牌,该令牌包含: 用户id 时间戳 权限 我的问题是,是否最好使用对称算法加密这些令牌并将其传递给客户端,或者只传递指向我的会话表中用户会话的唯一哈希值。所以基本上: 存储在客户端的令牌-当te服务器收到令牌时,它将被解密,所有数据都存储在内存中 有关会话的数据存储在数据库中,客户端接收哈希值-当服务器接收哈希值时,将在数据库中查找会话数据并从数据库中获取会话数据 哪种解决方案更适合处理数百万用户的大型

我正在构建一个RESTfulWebAPI。一旦用户经过身份验证和授权,他们将获得一个访问令牌,该令牌包含:

  • 用户id
  • 时间戳
  • 权限
我的问题是,是否最好使用对称算法加密这些令牌并将其传递给客户端,或者只传递指向我的
会话表中用户会话的唯一哈希值。所以基本上:

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

有关会话的数据存储在数据库中,客户端接收哈希值-当服务器接收哈希值时,将在数据库中查找会话数据并从数据库中获取会话数据


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

我个人会将令牌发回。但我不会依靠代币来提供信息;相反,我会使用它作为散列来再次获取特定用户的信息

缓存应该能够处理任何性能问题

与您的两种选择相反,我这样做的原因是:

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

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


    有一个标准,叫做JWT,它在几乎所有的框架中都有实现,包括。

    如果我们不存储任何服务器端状态,那么当用户注销时,我们就无法使JWT失效。实际上,我们的服务没有注销功能,这可能是一个安全问题,特别是如果我们在将来将过期时间设置得太远的话。另一方面,如果我们设置的过期时间太快,我们可能会有一个问题,用户仍然登录,但没有一个有效的JWT。这可能会导致笨拙的错误处理和用户工作流问题。有没有办法解决这个问题?提供api方法“refresh_token”是一个好主意吗?实际上,该服务变得无会话,因此“登录”或“注销”的概念实际上并不是从api的角度来考虑它的正确方法——它是关于对用户是否是他们所说的人有信心。一旦存储了某种会话状态,就很难扩展,因为它必须由所有服务器共享。使用API方法刷新令牌没有问题。