【问题标题】:IdentityServer4 + OWIN client: logout request not sending cookies to external IdP (because it is xhr)IdentityServer4 + OWIN 客户端:注销请求不向外部 IdP 发送 cookie(因为它是 xhr)
【发布时间】:2020-10-24 02:02:57
【问题描述】:

设置

我有一个基于 IdentityServer4 的身份提供者,并将 AD FS 作为外部身份提供者。

我有 3 种不同类型的客户:

  1. 基于 OWIN lib 的生产混合流客户端
  2. 一个测试混合流客户端(来自 IdentityServer4 存储库的最新示例客户端)
  3. 隐式流客户端(Angular)

问题

测试客户端和隐式流客户端按预期工作。 从 OWIN 客户端注销时,用户会从我的 IdP 中注销,但不会从 AD FS 中注销。

一些分析

从 OWIN 客户端注销时,从 AD FS 注销时不会发送 cookie。因此,AD FS 不会删除任何 cookie,因此用户在 AD FS 上保持登录状态。

最终原因是对应的请求是无法发送cookie的xhr请求(另见SAML logout request is not sending cookies to IdP,虽然我们不使用SAML)。

总结一下你可以在浏览器中观察到的调用:

  1. 请求 GET https://myidp/connect/endsession
    查询参数 post_logout_redirect_uri=https://xxx, id_token_hint=xxx, x-client-SKU=ID_NET45, x-client-ver=5.5.0.0
    响应重定向到 https://myidp/account/logout?logoutId=xxx
  2. 请求 GET https://myidp/account/logout
    查询参数 logoutId=xxx
    响应重定向到 https:// myadfs/oauth2/logout?post_logout_redirect_uri=xxx&id_token_hint=xxx&state=xxx&x-client-SKU=ID_NETSTANDARD2_0&x-client-ver=5.5.0.0
  3. 请求 GET https://myadfs/oauth2/logout
    请求类型 xhr
    查询参数 post_logout_redirect_uri=xxx, id_token_hint=xxx , state=xxx, x-client-SKU=ID_NETSTANDARD2_0, x-client-ver=5.5.0.0
    响应好的

对于 OWIN 客户端,最后一次调用是 xhr 类型,对于其他客户端,它是文档类型。我认为从客户端到 myidp 的初始调用中的某些内容必须不同,例如重定向链以 xhr 请求结束。这是什么东西?我该如何改变这种行为?

我仔细检查了每个电话的标题。对我来说,最怀疑的是 Sec-Fetch-Headers(其余的对于所有客户端来说几乎是平等的),但我不明白它们实际上在做什么。

对于 OWIN 客户端:

Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty

对于其他客户:

Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document

感谢任何提示!

【问题讨论】:

  • 看起来像是 SameSite cookie 或 CORS 问题?
  • @ToreNestenius 我不相信 CORS 问题。我有一个(仅用于 OWIN 客户端!)并通过配置 AD FS 来设置 CORS 标头来解决它。但是您能否进一步详细说明 SameSite cookie 问题?会发生什么?不同客户行为不同的根本原因是什么?我该如何改变它?
  • 浏览器中最近的 SameSite 更改如果配置不正确,将导致在执行跨域请求时不包含 cookie。不确定这是否与您的问题有关。

标签: cookies owin identityserver4 adfs


【解决方案1】:

post I cited above 实际上是完全正确的:我们必须中断 xhr 重定向链并改为执行正常的浏览器重定向。

但是,我们需要一些时间来弄清楚如何实现这一目标。这是我们的解决方案:

AuthorizationController 中的 Logout 操作返回了 Redirect,我们必须将其替换为 Ok 响应。这意味着替换

public class AuthorizationController : Controller
{
    public ActionResult Logout()
    {
      Request.GetOwinContext().Authentication.SignOut("Cookies");
      // ...Code for clearing cookies...
      return Redirect("/myroute");
    }    
}

通过

public class AuthorizationController : Controller
{
    public ActionResult Logout()
    {
      Request.GetOwinContext().Authentication.SignOut("Cookies");
      // ...Code for clearing cookies...
      return new HttpStatusCodeResult(HttpStatusCode.OK);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 2019-11-18
    • 2021-07-30
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    相关资源
    最近更新 更多