4

使用 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 命中我们的端点,例如 identityserver/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 请求?

非常感谢任何建议。

4

1 回答 1

1

将 Idp 发起的登录与 SAML2 + OIDC 一起使用有点棘手,因为 OIDC 不支持它。这意味着 IdSrv3 也不是真正为该场景构建的。

您需要的大纲是:

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

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

于 2016-11-30T08:28:00.943 回答