【问题标题】:Okta Kentor.AuthServices IdentityServer3 IDP-initiated SSO is triggering SP-initiated SSO - error or design?Okta Kentor.AuthServices IdentityServer3 IDP 发起的 SSO 正在触发 SP 发起的 SSO - 错误还是设计?
【发布时间】:2016-11-28 09:36:04
【问题描述】:

使用 IdentityServer3、Kentor.AuthServices 0.19(带有 OWIN 中间件)和标准 MVC 4 WebApi 2 应用程序,我们已按照https://github.com/KentorIT/authservices/blob/master/doc/IdentityServer3Okta.md 的说明进行操作 看来我们成功地实现了 IDP 发起的登录。

但是,当我们仔细查看此内容并使用 KentorStubIdp(我们首先注意到我们被提示提供 SAML 响应的地方)时,我们发现了以下内容

  1. IDP 到达我们的端点,例如身份服务器/okta/acs,状态 303
  2. 在我们的应用程序中成功重定向到我们的重定向端点,它被编码为返回到身份服务器授权端点的重定向,因此 var client = new AuthorizeRequest(new Uri(identityServerUrl + "connect/authorize")); var returnUrlForIdp = client.CreateAuthorizeUrl( "{client_identifier}", "id_token token", scopesForAuth, hostUrl, state, nonce, acrValues: string.Format("idp:{0}", idp), responseMode: "form_post" ); return Redirect(returnUrlForIdp);
  3. 这会导致身份服务器/连接/授权的 302。看来这有它需要的所有登录信息,我本来希望 200 直接进入应用程序,但是我们得到一个 302 到 identityserver/login?signin=xxx ,它给出了一个似乎触发的 401...
  4. 对登录端点的后续调用将 303 重定向回 IDP,这标志着由 SP 发起的最终成功登录的开始。这意味着它返回到 identityserver/okta/acs,然后是 /callback 端点,然后是 /connect/authorise,然后用户登录。

我在第一次和第二次调用 /connect/authorise 之间找不到任何有意义的区别,除了

  1. 在成功尝试之前调用了 identityserver/callback
  2. idsvr 和 idsvr.session 的 Cookie 似乎没有在第一次调用时设置,而是在第二次调用中

此外,Kentor 配置设置似乎是有序的 - 例如 AllowUnsolicitedAuthnResponse = true AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Passive 虽然最后一个似乎没有任何效果

在这一点上,我只是想弄清楚 a) 它是否应该在幕后工作,b) 如果不是,我应该把注意力集中在哪里来诊断问题。

如果 IDP 发起的 SAML 请求缺少信息,是否有一组特定的情况会触发 authservices 发起 SP 发起的 SAML 请求?

非常感谢任何建议。

【问题讨论】:

  • 你能看到在步骤1中是否成功设置了cookie吗? IE。如果 AuthServices 身份验证创建 IdSrv 登录会话?
  • @AndersAbel 如果我使用 KentorStubIdp,那么它会返回 SP 发起的尝试(即从 IDP 发起的 stubidp.kentor(点击登录)> IdentityServer/stubidp/acs > RpRedirect > IdentityServer/Connect/Authorise > stubidp.kentor?SAMLRequest=xxx),有 3 个 cookie:Kentor.xxxxxx、idsrv.external 和 signinmessage.#######。我不确定这是否构成登录会话,我猜不是?

标签: saml-2.0 identityserver3 okta kentor-authservices


【解决方案1】:

通过 SAML2 + OIDC 使用 Idp 启动的登录有点棘手,因为 OIDC 不支持它。这意味着 IdSrv3 也不是真正为该场景构建的。

你需要的大纲是:

  1. Idp 向 IdSrv3/AuthServices 发送未经请求的响应。
  2. AuthServices 验证响应
  3. IdSrv3 在 IdSrv3 上建立登录会话。
  4. 用户被重定向到客户端应用程序的登录初始化 url
  5. 客户端应用向 IdSrv3 发起 OIDC 登录。
  6. IdSrv3 单点登录并在 3 中建立会话。
  7. 用户被重定向回客户端应用程序。

看起来第 2 步有效,但第 3 步未正确完成。这意味着在第 6 步中没有会话,因此用户被一直重定向到 Idp 以获取现有会话。这可行,但有点难看。如果您稍后想要单点注销,则会话计数不匹配可能会导致问题。

【讨论】:

  • 在与 Erik Dahl(他参与了 Kentor > Okta 示例,记录在 kentor 项目网站上)交谈时,他的 IDP 发起的方法使 SP 发起的调用按设计进行(以获取更多声明)。可能值得更新文档以明确这一点。虽然我们不需要这样做,但我认为我们可能需要原样离开,直到我们有时间进行进一步调查。修复第 3 步可能很简单,但可能是 IdServer 问题?
猜你喜欢
  • 2019-03-23
  • 2017-11-23
  • 2020-06-01
  • 2012-09-28
  • 1970-01-01
  • 2019-12-22
  • 2017-05-19
  • 2015-03-15
  • 2013-05-29
相关资源
最近更新 更多