OAuth 2.0 如何使用密码授予使授予的身份验证令牌无效

OAuth 2.0 How to invalidate granted auth tokens using password grant

对于以下场景:

  1. 用户代理(浏览器、用户)向资源服务器发出 Ajax 请求
  2. ASP.NET 使用 DotNetOpenAuth(客户端)的 MVC 应用程序
  3. OAuth-授权服务器
  4. ASP.NET Web API(资源服务器)

用户输入他的凭据以登录到 MVC 应用程序。 MVC 应用程序使用用户凭据和 MVC 应用程序的 Client.Id + Client.Secret 向授权服务器授予密码,发出令牌请求。 MVC 应用程序从授权服务器接收 OAuth 令牌。 令牌被传递回客户端,客户端将令牌存储在 LocalStorage 中。

现在我的问题:

  1. 如何使令牌无效,使用户无法再访问资源服务器 (Web API)。由于令牌现在驻留在 LocalStorage 中,因此 MVC 应用程序无法再控制令牌。一个解决方案可能是使用非常短的到期时间或使用一些 SignalR 的东西来使令牌无效,但是已经获得令牌访问权限的恶意用户将有足够的时间来做坏事。我认为没有办法立即使令牌失效。并且资源服务器在令牌真正过期之前不会知道令牌已失效。

  2. 如果token过期了,流程是怎样的?我可以在浏览器中使用 JavaScript 检查到期日期/或等待来自资源服务器的 401 响应,然后向我的 MVC 应用程序(客户端)发出 Ajax 刷新令牌请求,然后请求来自授权服务器的新令牌(使用 Client.Id + Client.Secret + UserCredentials)并将新令牌传递回浏览器,然后可以将其用于对资源服务器的进一步请求(Web API).这是正确的方法吗?

在 logout/password 更改时,我可以从 LocalStorage 中删除令牌并在服务器端使令牌无效。

我想你几乎已经回答了你自己的问题! 您不能使服务器端的令牌无效(除非 DNOA 处理令牌撤销,我认为它不会处理)。 该令牌是不记名令牌,因此拥有它的任何人都可以在资源服务器上使用它,直到达到到期时间。保持短暂是最好的方法。

另外,在使用密码授予时,您应该只使用用户的凭据一次,以获取初始令牌和刷新令牌。然后,您可以将刷新令牌与 MVC 应用程序中的用户 ID 相关联,并在以后使用刷新令牌来获取新的访问令牌。