我使用 OWIN OAuth 2 来实现我的授权服务器提供程序。现在,我想实现令牌撤销(当我的客户端应用程序想要注销时)。
任何人都可以帮助我并告诉我如何在 OWIN KATANA OAuth 2 中实现令牌撤销。是否有一些好的做法?
3 回答
OAuth 2.0 涉及两种令牌。一个是访问令牌,另一个是刷新令牌。
对于刷新令牌,我真的推荐使用由 Taiseer Joudeh 编写的ASP.NET Web API 2、Owin 和 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 组件尝试解析令牌时,它发现令牌是空的。当然,空字符串不是有效的令牌,因此它将拒绝请求,就像您发送带有无效访问令牌的请求一样。
根据 OAuth 20 RFC,刷新令牌不用于撤销令牌 - 刷新“访问令牌的生命周期可能比资源所有者授权的权限更短且权限更少”。刷新令牌用于增加访问令牌的寿命或用稍后到期的新访问令牌更新旧的访问令牌。这通常用于防止再次询问用户他/她的凭据。为了撤销令牌,OAuth20 提供者应该公开这样的 WS/端点或其他一些机制。
刷新令牌是 OAuth2 允许撤销授权的方式。微软的OAuth2授权服务器中间件在这方面欠缺: