【问题标题】:OAuth 2.0 How to invalidate granted auth tokens using password grantOAuth 2.0 如何使用密码授予使授予的身份验证令牌无效
【发布时间】:2016-09-28 18:22:51
【问题描述】:

对于以下场景:

  1. 用户代理(浏览器、用户)向资源服务器发出 Ajax 请求
  2. 使用 DotNetOpenAuth(客户端)的 ASP.NET 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. 如果令牌已过期,流程会怎样?我可以在浏览器中使用 JavaScript 检查到期日期/或等待来自资源服务器的 401 响应,然后向我的 MVC 应用程序(客户端)发出 Ajax 刷新令牌请求,然后从授权服务器请求一个新令牌(使用Client.Id + Client.Secret + UserCredentials)并将新令牌传递回浏览器,然后可以将其用于对资源服务器(Web API)的进一步请求。这是正确的方法吗?

在注销/密码更改时,我可以从 LocalStorage 中删除令牌并使服务器端的令牌无效。

【问题讨论】:

    标签: c# asp.net-mvc oauth authorization dotnetopenauth


    【解决方案1】:

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

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

    【讨论】:

    • 是的,如果不耦合 OAuth 服务器和资源服务器,这是不可能的,否则您必须在到达资源服务器时根据 OAuth 服务器检查令牌以检查是否已被撤销...
    猜你喜欢
    • 2021-01-05
    • 2017-08-30
    • 1970-01-01
    • 2020-09-08
    • 2017-01-10
    • 2017-09-18
    • 1970-01-01
    • 2018-02-25
    • 2014-06-10
    相关资源
    最近更新 更多