如何坚持OAuth 2刷新令牌

时间:2014-10-25 12:21:10

标签: security authentication oauth oauth-2.0 access-token

无法找到有关实施OAuth 2刷新令牌持久性的最佳方法的指导,以及有关实际存储内容和方式的常见意见。

虽然Taiseer Joudeh在ASP.NET Web API中有关于OAuth授权的very good totorial。 这是文章中的RefreshTokens表:

enter image description here

其中: ID - 唯一令牌标识符的哈希值,主题 - 用户名, ClientId - 应用程序标识符, ProtectedTicket - 序列化访问令牌。

我想在SO社区的帮助下证明或破坏那里做出的一些决定。 所以这是我的担忧:

  1. 我们为什么要坚持短暂的access_token ?到目前为止,我可以想到这种方法的两个原因。 首先,当您在任何地方保留用户访问权限时,可能会出现安全威胁,只是等待某人抓住它们,并重新使用不可靠的资源服务器(请记住,他们应该使用用于serilize / deserialize键的相同算法)。 第二次,一旦您决定更改序列化算法的任何部分,就必须关心更新这些持久性票证。那么,为什么我们在验证client_idrefresh_token而不是从数据库中读取和反序列化后,我们只是在运行时创建新票证?

  2. 如何加密access_token ,如果我们应该坚持下去?序列化票证上的盐+ SHA2能否完成工作还是有更好的方法?

  3. 为什么哈希refresh_token id ?它实际上保护了哪种攻击?如果我们将哈希密钥作为refresh_token发送,同时在数据库中保留真正的密钥,那么它会更安全吗?这种方式对refresh_token进行暴力攻击(猜测随机用户的刷新令牌)也必须猜测哈希算法。

1 个答案:

答案 0 :(得分:2)

我会尝试更多地澄清这些观点:

1& 2 - 如果您查看context.SerializeTicket here的源代码,您会注意到此受保护的票证是使用默认的DPAPI加密的,该DPAPI依赖于服务器machineKey进行加密。因此,如果您从DB中获取它,除非您拥有machineKey,否则无法对其执行任何操作。

3 - 如果您的DBA可以访问此表并且他可以看到普通刷新令牌标识符,那么他可以使用grant_type(refresh_token)

使用这些刷新令牌标识符简单地获取新的访问令牌