OAUTH2 - 使用刷新令牌实现滑动到期

时间:2015-11-20 22:21:17

标签: asp.net-web-api oauth-2.0

我有一个单页面的Web应用程序,它使用OAuth承载令牌来验证用户身份。我们不使用cookie,也不支持会话。它只是调用ASP.NET Web API来访问具有访问令牌的受保护资源。我们还支持刷新令牌以获取新的访问令牌。

我如何实现滑动过期?我只看到三个选项:

  1. 使用刷新令牌在每个请求上发出新的访问令牌。这违背了刷新令牌的全部目的。

  2. 跟踪上次请求何时在客户端应用中。每个请求都会看到最后一个请求的时间,如果是在一个设定的时间段之后,请将它们记录下来并打开登录屏幕。如果没有,并且他们的访问令牌已过期,请发出一个新令牌并让他们继续。这对我来说似乎有些混乱和不安全。

  3. 忘记刷新令牌。将访问令牌存储在具有到期日期的数据库中,并在每个请求时更新它。我更喜欢不对每个请求进行数据库操作。

  4. 是否有另一种选择或其中一项实际上可以接受?

1 个答案:

答案 0 :(得分:2)

你说没有会话支持。但这几乎就是会话的目的,而ASP.NET和IIS支持它们有很多选项来管理它们,有或没有cookie,如果我没记错,有或没有数据库。如果您的案例中没有会话......

还可以选择使用加密令牌,其中包含会话标识和超时信息。然后,服务器只需要知道用于解密令牌的密钥。服务器在每个请求上解密令牌,更新时间并使用新响应发回新的加密令牌。您可以将令牌作为标题,Cookie,网址的一部分发送,然后选择。但是cookie和标题是针对这种使用模式而设计的,并且在我的经验中减少了工作量。

未解密的令牌被视为未经授权的请求。超时按照通常情况处理,例如使用刷新令牌获取新的身份验证。

如果您有服务器场,则只需在服务器之间共享解密密钥。无需在数据库或共享缓存中进行会话。

您可以详细说明这会使密钥随时间过期。然后,服务器只需不经常检查目录服务,共享缓存或数据库,消息或队列以获取最新的密钥。如果你正确地生成它们并使它们过期的速度超过有人可以蛮力破解它们,那么你就赢了! (笑话)Windows有api支持你加密和密钥管理。

几年前我为一个项目成功做到了这一点。它实际上是在没有服务器端状态的情况下实现会话。与所有会话方法和所有身份验证方法一样,它存在漏洞。

但如果没有相反的特殊理由,我会将会话用于其预期目的。如果我希望每个浏览器选项卡都有单独的身份验证,我将使用基于标头的会话令牌。如果我希望浏览器会话中的浏览器选项卡共享身份验证,我会使用会话cookie。

或者我会使用您的选项三,可能使用共享缓存而不是数据库,具体取决于性能要求和基础结构。我怀疑IIS + ASP.Net甚至可能为你做到这一点,但我已经离他们太久了不知道。