如何调试我的 SSO SAML 与 zendesk 的集成



我正在使用 zendesk 在 SAML 服务上设置单点登录。我正在使用node/express和node-samlp编写一个自定义SAML服务器。

Zendesk 是 SP,我的 SAML 服务器有自己的身份提供商

用户步骤如下:

导航到帐户.zendesk.com 并被重定向到帐户.com/登录?SAMLRequest=asdfasdfafsd

然后,用户输入凭据并发布到节点服务器。在服务器上,我能够解析* SAMLRequest,验证用户并为用户提供SAMLResponse。

用户从节点服务器接收 SAMLResponse,并被重定向到:account.zendesk.com?SAMLResponse=asdfasdf&RelayState=xxx

此时,用户将获得未找到的页面。我不确定我做错了什么,在这一点上,我猜测我的 SAMLResponse 要么格式不正确,要么我将用户重定向到错误的地址。

PS:最初 samlp 开箱即用,我分叉了存储库并更新了几个依赖项,它开始工作了。

*我最初无法从 zendesk 解析 SAMLRequest。当我在查询参数上使用decodeURIComponn时,有新的行字符和空格,我用"+"替换了它们,使其工作。然后我意识到他们的查询参数似乎不是 URI 编码的......

首先,SAML 响应没有 SAML 重定向绑定这样的东西。您可以在 HTTP POST 中将 SAML 响应作为表单编码的参数发送,但不能在重定向中将其作为查询参数传递。您的 SAML IDP 实现不符合规范,Zendesk 可能会因此拒绝该消息。

请参阅 http://docs.oasis-open.org/security/saml/v2.0/saml-profiles-2.0-os.pdf#page=16:

  1. 身份提供程序向服务提供商发出问题 在步骤 5 中,身份提供程序发出要传递的消息 服务提供商的用户代理。HTTP POST 或 HTTP 项目绑定可用于将消息传输到服务 通过用户代理提供程序。该消息可能指示错误,或者 将包括(至少)身份验证断言。HTTP 重定向 不得使用绑定,因为响应通常会超过 大多数用户代理允许的 URL 长度。

事实上,正如 @hans-z 已经提到的,SAMLResponse 总是通过 POST 发送的!您可以通过提供页面来触发此浏览器 POST,该页面在页面加载(通过 JavaScript)时自动提交表单(包含 SAMLResponse)。

由于您是通过 POST 发送的因此您的 SAMLResponse 不应再进行 URL 编码