OAuth 2 中的访问令牌撤销实现
Posted
技术标签:
【中文标题】OAuth 2 中的访问令牌撤销实现【英文标题】:Access token revocation implementation in OAuth 2 【发布时间】:2014-05-07 15:10:42 【问题描述】:我使用 OWIN OAuth 2 来实现我的授权服务器提供程序。现在,我想实现令牌撤销(当我的客户端应用程序想要注销时)。 谁能帮助我并告诉我如何在 OWIN KATANA OAuth 2 中实现令牌撤销。有一些好的做法吗?
【问题讨论】:
【参考方案1】:OAuth 2.0 涉及两种令牌。一个是访问令牌,另一个是刷新令牌。
对于刷新令牌,我真的推荐Taiseer Joudeh 写的Token Based Authentication using ASP.NET Web API 2, Owin, and Identity。他提供了有关设置基于令牌的身份验证的分步教程,包括撤销刷新令牌。
对于访问令牌,我使用黑名单来存储已撤销的访问令牌。当用户登录时,我将用户当前的访问令牌添加到黑名单中。如果有新的请求,我首先检查它的访问令牌是否在黑名单中。如果是,拒绝请求,否则让 OAuth 组件进行验证。
以下是一些实现细节:
我使用缓存作为黑名单,并将缓存项的过期时间设置为访问令牌的过期时间。缓存项(访问令牌)过期后将自动从黑名单中删除。 (我们不需要在访问令牌过期后将其保留在黑名单中。如果令牌过期,无论是否在黑名单中,都无法通过OAuth验证机制。
以下代码展示了如果访问令牌在黑名单中,如何拒绝请求。
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
Provider = new OAuthBearerAuthenticationProvider()
OnRequestToken = context =>
if(blackList.contans(context.Token))
context.Token = string.Empty;
return Task.FromResult<object>(null);
如果我在黑名单中找到访问令牌,我会将访问令牌设置为空字符串。后来,当 OAuth 组件尝试解析令牌时,它发现令牌是空的。当然,空字符串不是有效的令牌,因此它会拒绝请求,就像您发送带有无效访问令牌的请求一样。
【讨论】:
如果你能复制你的代码来添加黑名单就完美了:) 是否存在您需要撤销令牌但不知道令牌是什么的情况?我试图弄清楚黑名单是否比存储所有令牌严格更好(这是我发现的一些文章建议实现撤销的方式,但这首先破坏了使用令牌的无状态论点)。【参考方案2】:根据 OAuth 20 RFC,刷新令牌不用于撤销令牌 - 刷新“访问令牌的生命周期可能比资源所有者授权的权限更短且权限更少”。刷新令牌用于增加访问令牌的生命周期或用稍后到期的新访问令牌更新旧的访问令牌。这通常用于防止再次询问用户他/她的凭据。为了撤销令牌,OAuth20 提供者应该公开这样的 WS/端点或其他一些机制。
【讨论】:
其他机制是什么?我知道什么是刷新令牌,请解释我如何撤销令牌。我已经编辑了我的问题 这取决于您使用的 OAuth20 提供程序。例如,OAuth20 提供者可能会公开一个撤销令牌的 Web 服务。但是,我不知道如何使用 OWIN KATANA OAuth 2 来完成。 我有自己的提供者,我使用 owin katana oauth 2 构建了它,但我不知道如何撤销 :(【参考方案3】:刷新令牌是 OAuth2 允许撤销授权的方式。微软的OAuth2授权服务器中间件在这方面欠缺:
http://leastprivilege.com/2014/03/24/the-web-api-v2-oauth2-authorization-server-middlewareis-it-worth-it/
【讨论】:
以上是关于OAuth 2 中的访问令牌撤销实现的主要内容,如果未能解决你的问题,请参考以下文章