【问题标题】:How does a client using Owin/Katana/OIDC use a Refresh Token?使用 Owin/Katana/OIDC 的客户端如何使用刷新令牌?
【发布时间】:2020-11-10 00:38:32
【问题描述】:

我有一个 ASP.net MVC Web 应用程序,它使用 Microsoft 的 Owin 中间件 (Microsoft.Owin.Security.OpenIdConnect) 来配置 OpenID Connect 身份验证。我的身份提供者 (Okta) 配置为支持刷新令牌,并且我已确认它正在工作。登录时,我的应用程序按预期收到访问、ID 和刷新令牌。这些令牌经过验证并在名为“.AspNet.Cookies”(默认)的 cookie 中返回给客户端。在每个请求中,cookie 和这些令牌都被解析为一组声明。到目前为止很棒。 ????

Owin (Katana) 中间件似乎没有对刷新令牌做任何进一步的事情,因此我实现了一个令牌客户端,以使用刷新令牌从我的 IdP 请求一个新的访问令牌。这按预期工作。 ????

两个问题:

  1. 应用程序应在何时何地检查访问令牌是否已过期并请求新的?
  2. 收到新的访问、ID 和刷新令牌后,应用程序应如何以及在何处更新用户身份、声明和 cookie?

【问题讨论】:

    标签: asp.net-mvc owin openid-connect katana


    【解决方案1】:

    OWIN COOKIE 更新

    我相信this post 末尾的评论具有您可以编写的代码类型 - 我记得几年前使用过类似的代码。

    在 OWIN 中,您使用的是由 cookie 保护的服务器端堆栈,因此我不确定访问令牌的实际使用位置,但其中一个可能是真的?

    • C# 后端使用令牌调用 API
    • Web UI 从 Web 后端下载令牌并对 API 进行 Ajax 调用

    处理过期令牌的模式

    处理过期的唯一可靠模式是在 API 客户端代码中执行此操作:

    • 当您从 API 收到 401 响应时
    • 尝试刷新令牌并使用新的访问令牌重试 API 调用
    • 如果无法刷新令牌,请重定向用户重新登录

    我总是用 2 个类来实现这一点,就像我的这个 SPA 代码一样:

    如果 Web UI 从 Web 后端获取令牌然后调用 API,您的 Web 后端可以提供类似于我的身份验证器类中的 MVC 操作:

    • getAccessToken - 获取当前访问令牌,虽然它可能会失败并返回 401
    • refreshAccessToken - 如果收到 401 并且您需要新令牌,请使用此令牌

    代币到期时间

    还可以在后台检查令牌到期时间 - 以减少客户端 401 的数量。然而,这并不是一个完整的解决方案,因为除了到期之外,还有其他原因可能会出现 401。

    【讨论】:

    • 嗨@Gary,谢谢你的回答!我实现了与您引用的这个答案 (stackoverflow.com/a/36992935/97276) 非常相似的东西,虽然它似乎有效,但它似乎没有更新 cookie,所以下次刷新 cookie 中的令牌仍然过期。我希望 .GetOwinContext().Authentication.SignIn(newIdentity) 会触发中间件设置新的 cookie,但它似乎确实在这样做。不确定我错过了什么?
    • 您可能缺少了 here 所讨论的 AllowRefresh 标志
    • 看到这条评论我真的很兴奋,并希望这会奏效,但它没有。我在 GitHub 上打开了 Okta 的问题:github.com/okta/okta-aspnet/issues/130
    • 我认为 Laura 对 ReplaceIdentity 的评论就是答案。我知道我在上一家公司得到了这个工作——只是不再能够访问源代码,而且我已经有一段时间没有使用技术堆栈了。我知道调用“登录”听起来不对...
    • 嗨@Gary。感谢您的跟进。使用 ReplaceIdentity 不是答案,因为它发生在设置 cookie 之后,因此后续请求包含旧 cookie、声明和令牌。但是,我确实找到了一个很好的解决方案,它类似于您提供的链接。使用 .SignIn() 方法,但不是创建新的 ClaimsIdentity,而是使用当前身份并简单地删除旧的令牌声明并添加新的声明。然后调用 SignIn() ,它会在创建 cookie 之前触发 cookie 中间件方法。问题解决了!我在 GitHub 线程中进行了描述。
    猜你喜欢
    • 2012-03-03
    • 2020-06-02
    • 2019-12-30
    • 1970-01-01
    • 2018-12-14
    • 2013-02-03
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多