Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.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# 如何在Oauth2中撤销RefreshToken并同时使AccessToken无效_C#_Asp.net_Oauth 2.0_Token_Owin - Fatal编程技术网

C# 如何在Oauth2中撤销RefreshToken并同时使AccessToken无效

C# 如何在Oauth2中撤销RefreshToken并同时使AccessToken无效,c#,asp.net,oauth-2.0,token,owin,C#,Asp.net,Oauth 2.0,Token,Owin,我正在使用Owin Oauth2(授权和资源服务器相同)开发单页应用程序(AngularJS+.Net MVC Json Rest API)的身份验证流 我之所以选择承载令牌路由而不是传统的cookie+会话,是因为我希望保持无状态,也因为相同的Api将用于令牌问题比cookie问题少的移动应用程序 这是简化流程: 用户向服务器提交用户名/密码(通过Https向服务器发送) 令牌(提供程序路由) Owin创建一个带有声明的AccessToken,声明包含 生成的GUID(表示会话Id之类的内容

我正在使用Owin Oauth2(授权和资源服务器相同)开发单页应用程序(AngularJS+.Net MVC Json Rest API)的身份验证流

我之所以选择承载令牌路由而不是传统的cookie+会话,是因为我希望保持无状态,也因为相同的Api将用于令牌问题比cookie问题少的移动应用程序

这是简化流程:

  • 用户向服务器提交用户名/密码(通过Https向服务器发送) 令牌(提供程序路由)
  • Owin创建一个带有声明的
    AccessToken
    ,声明包含 生成的GUID(表示会话Id之类的内容)和一些其他声明
  • Owin创建一个
    refreshtToken
  • 服务器在
    refreshttoken
    表中创建一个包含以下字段的条目:
GUID(主键)|刷新令牌|票证|日期发布|日期过期|日期结束

  • 服务器同时提供
    AccessToken
    RefreshToken
    发送到客户端

  • 客户端将
    AccessToken
    refreshtToken
    存储到会话存储中

  • 客户端使用
    AccessToken
    访问Api

当AngularJS检测到AccessToken即将过期时,它会缓冲所有请求并发出一个
grant_type refresh_token请求

服务器使用客户端提供的刷新令牌,并且:

  • 从Db检查刷新令牌是否仍然有效(
    DateExpire>GetTime(),并且DateEnd为Null
  • 从Db拿票
  • 从票证创建AccessToken
  • 使用新日期、新的
    refreshtToken
    和新票证更新db条目(注意:GUID保持不变)
当客户端点击注销服务器端时,从已登录用户的标识声明中读取的GUID将用于使表中的条目无效(
DateEnd=GetTime()
)。
客户端两个令牌都将从
会话存储中删除

通过这种方式,我可以撤销
refreshttoken
拒绝任何其他请求以获取新的
AccessToken

这种方法的问题是,当授权被撤销时(即:
refreshttoken
在DB上无效),存在一个时间窗口,但
AccessToken
仍然有效(尽管时间有限)

我想做的是在每个请求上检查
AccessToken
的有效性,从用户身份声明中获取GUID,并点击db检查特定GUID的刷新令牌是否仍然有效

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


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

您的方法没有问题,与我之前提到的方法非常相同,但我建议您在发送访问令牌时不要进行任何DB检查


为什么不发行短期访问令牌(即30分钟),并在撤销刷新令牌后等待访问令牌的生存时间到期。在客户端上,您可以清除客户端本地存储中的刷新令牌和访问令牌。

我不太喜欢这样的想法,即当有人注销时,某些凭据仍然可以访问资源服务器。通过你在博客上关于Owin和Oauth 2的精彩文章,你正在帮助很多人。我已经读了几百次了:)。很高兴这是有用的:)我同意你的观点,最好完全撤销它,但这就是持票代币的工作原理:(@TaiseerJoudeh:For bank use我的要求:1)一个用户有一个实例。2)应该立即注销,一旦成功注销,代币应该失效。身份对世行项目有好处吗?如果不是,那么这个问题的其他解决方案是什么?因为银行项目应该比其他应用程序更安全!!!提出了一种清除访问令牌的方法:本文档为OAuth授权服务器提出了一个额外的端点,允许客户端通知授权服务器不再需要以前获得的刷新或访问令牌。上面的链接不再起作用了,我们在其他地方有没有类似的帖子?如果是,请添加链接仅出于兴趣我在阻止对移动设备的电子邮件访问时遇到了Office 365 Exchange的此问题。在访问令牌到期之前,用户的电子邮件帐户不会被锁定,在本例中,这正好是一个小时。