2014-09-27 49 views
3

我正在使用Owin Oauth2开发单页面应用程序(AngularJS + .Net MVC Json Rest API)的验证流程(授权和资源服务器是相同)。如何在Oauth2中同时撤销RefreshToken并使AccessToken失效

我选择了传统cookie +会话中的承载令牌路由,因为我想保持无状态,也是因为相同的Api将被移动应用使用,其中令牌的问题少于Cookie。

这是简化的流程图:

  • 用户(通过HTTPS POST到 TokenProvider路线)提交用户名/密码到服务器
  • Owin创建AccessToken用含有 生成GUID一个如权利要求(这将表示类似于会话ID)和其他一些索赔。
  • Owin创建RefreshToken
  • 服务器会在RefreshToken表具有以下字段中输入:

GUID(PK)| RefreshToken |订票| DateIssued | DateExpire | DateEnd

  • 服务器提供了两个AccessTokenRefreshToken给客户端。

  • 客户端将AccessTokenRefreshToken存储到SessionStorage中。

  • 客户端通过AccessToken访问Api。

当AngularJS检测到的accessToken接近到期时,它缓冲所有请求和问题grant_type refresh_token request;
服务器使用客户端提供的RefreshToken和:

  • 检查该刷新令牌还是从数据库有效(DateExpire > GetTime() And DateEnd is Null
  • 注意到从数据库门票
  • 门票创建一个的accessToken
  • 使用新日期更新db条目,新的RefreshToken和新票(注意:GUID保持不变)

当客户端登录注销服务器端时,从登录用户的身份声明中读取的GUID用于使表中的条目无效(DateEnd = GetTime())。
客户端两个令牌都从SessionStorage中删除。

通过这种方式,我可以撤消RefreshToken拒绝任何其他请求获得新的AccessToken

这种方法的问题是,授权被撤销时存在时间窗口(即:RefreshToken在数据库上无效),但AccessToken仍然有效(虽然对于有限的时间帧)。

我想要做的是检查每个请求上的AccessToken的有效性,从用户身份声明中获取GUID并敲击db以检查该特定GUID的Refresh Token是否仍然有效。

尽管使查询执行O(1)非常简单,但单点故障本身可能会对系统的可伸缩性和性能产生负面影响。

您是否知道另一种方法来缓解此问题,并且您是否看到我的方法中存在任何缺陷?

+0

仅供我感兴趣我在阻止电子邮件访问移动设备时遇到了Office 365 Exchange的此问题。在访问令牌到期之前,用户的电子邮件帐户不会被锁定,在这种情况下完全是一个小时。 – peterincumbria 2017-08-21 08:14:57

回答

8

你的方法没有什么问题,它与我之前的方法blogged非常一致,但我建议在发送访问令牌时不要做任何数据库检查。

为什么您不发出短期存取令牌,即(30分钟),并且您在撤销刷新令牌后等待存取令牌生命期过期。在客户端上,您可以清除刷新令牌并从客户端本地存储中访问令牌。

+1

我不太喜欢当某人注销时,某些凭据仍然可以访问资源服务器。在你的博客上关于Owin和Oauth 2的精彩内容,你正在帮助很多人。我已经阅读了数百次的博客文章:)。 – systempuntoout 2014-09-27 15:41:29

+0

很高兴它有帮助:)我同意你最好完全撤销它,但这是如何持票人令牌工作:( – 2014-09-27 15:44:40

+0

@TaiseerJoudeh:银行使用我的要求:1)有一个用户的实例.2)注销应该立即发生,一旦注销成功,令牌应该失效。银行项目的身份是否有益?如果不是,那么这个问题的其他解决方案是什么?因为银行项目应该比其他应用程序最安全! – 2017-04-29 09:43:02