IDP 和 SP 身份验证流程无需重定向到 IDP

IDP and SP authentication flow without redirecting to the IDP

标准 SSO 例程涉及主动将用户从 SP 重定向到 IDP,然后再返回。虽然这种机制有几个很大的优点,但缺点是重定向可能会使用户感到困惑。 ("Hey I was just on azure.com and now I am live.com huh?").

我想支持在 SP 网站中包含 username/password 登录表单的场景。在这种特定情况下,我既是 SP 又是 IDP 的所有者,并且可以完全控制其实施。怎样才能达到这样的境地呢?我可以想象以下方法:

<form action="https://idp.contoso.com/login" method="post">
  <input type="hidden" name="issuer" value="sp.contoso.com">
  Username: <input type="text" name="username"><br>
  Password: <input type="text" name="password"><br>
  <input type="submit" value="Submit">
</form>
  1. 将以上表格包含在 SP 的网站中。
  2. IDP 接受 POST、验证凭据并创建 SAML 响应
  3. IDP returns 具有自动提交表单的网站,POST 是对颁发者的 SAML2 端点 url 的 SAML 响应(例如 https://sp.contoso.com/saml
  4. SP 接受 POST,验证 SAML 响应并根据 SP 特定标准构建用户会话

这是可行的解决方案吗?如果是这样,以任何符合标准的产品(如 WSO2 Identity Server)支持的方式来证明这一点?如果不是,在使用来自 SP 的登录表单时针对 IDP 对用户进行身份验证的正确方法是什么?

将登录延迟到外部权限的整个想法是不必处理登录界面。在许多情况下,Idp 使用智能卡、一次性 SMS 代码或类似的方式,因此它不仅仅是一个简单的 username/password 组合登录。

如果您同时控制 SP 和 Idp 并希望避免重定向到 Idp,我认为最好在 Idp 端创建一个 API 让 SP 提供 username/password 直接返回认证结果。该结果可以是 SAML 断言的形式,也可以是自定义的形式。

我刚刚使用 WSO2IS 尝试了相同类型的场景,它包含一些称为请求路径验证器的东西,它验证登录请求中的用户凭据。是的。例如,如果您使用 SAML2 SSO 方案,SP 可以使用 POST 绑定向 IDP 发送 SAML2 身份验证请求。在同一个请求中,SP 可以发送从 SP 应用程序的登录页面检索到的最终用户的凭据。然后您将看不到 IDP 中的登录页面,并且从身份验证请求中检索凭据并使用 IDP 的用户存储进行验证。如果成功,则生成 SAML2 响应。我已经用示例服务提供商应用程序和 WSO2IS 写了一些关于它的博客,希望它对您有所帮助。请从here