使用 java 读取从 Azure 活动目录收到的 SAML 响应

Read SAML response received from azure active directory using java

我是 azure 活动目录 (AAD) 的新手,到目前为止,我已经在 azure AD 中创建了企业应用程序,并且此应用程序的设置我已经为 Single sign-on option 选择了集成 windows auth(IWA) .我已经在此配置了应用程序代理,pre-authentication 设置为 AADinternal URL 是我基于 java 的 Web 应用程序 URL.

在另一侧,AAD 连接器作为 ADFS 与联邦一起安装。

现在的流程是:当我点击 User access URL(URL 用于企业应用程序)时,它会挑战域验证,验证成功后它会重定向到我的 on-premises AD 表单。成功通过 ADFS 身份验证后,它会重定向到我的 Web 应用程序。

现在我收到的响应是 SAML 响应。

我的问题是如何使用 java 读取此 SAML 响应,我发现 AFA 是 ADAL 是一种方法。 here 是我找到的示例项目。

但我发现这对我没有用。是否有任何其他方式来阅读此回复,或进行任何修改。

问题可能很广泛:那么有任何建议或参考 link 吗?

更新:

我的应用程序没有直接收到 SAML 响应。通过应用程序代理收到的响应不是 SAML。或者我们可以添加一些自定义 headers 作为应用代理发送的响应。请在下面找到图片以便更好地理解

更新2:

是否可以发送自定义 header 作为 azure 应用程序代理发送的响应?

目前收到 header 是

  1. 连接
  2. 授权协商
  3. cookie
  4. 主机
  5. 其他如x-forwarded-by、语言、编码

ADAL 是用于 OpenID Connect 而不是 SAML 的库。

查看 Spring Security 或 OpenSAML 的代码 - 都是开源的 Java。

本质上,它只是 XML。

还有online tools会给你一些提示。

看起来你的设置可能没有问题,但目前 Azure AD 应用程序代理的一个限制是它无法将 SAML 令牌传递到 SSO 的内部 Web 应用程序。

请查看下面的链接,这似乎是 Azure AD 团队的计划项目,您可以尝试与 Microsoft 支持人员确认这一点,并从他们那里获取有关可能解决方法的详细信息。

希望对您有所帮助!

  1. 应用程序代理 - SAML 作为 SSO 选项 https://feedback.azure.com/forums/169401-azure-active-directory/suggestions/33318022-app-proxy-saml-as-sso-option

    他们在这里提到该项目的工作已经开始,甚至建议解决并分享联系信息以询问更多详细信息。

  2. 启用 SAML 令牌通过 Azure 应用程序代理流向内部站点 https://feedback.azure.com/forums/374982-azure-active-directory-application-requests/suggestions/19204666-enable-saml-tokens-to-flow-through-azure-applicati

    这个更详细地解释了问题本身


更新:这是我从 Azure AD 反馈团队收到的回复的评论

第 1 部分:在应用程序代理中配置应用程序

第一步:添加一个新的Enterprise Application,并选择“on-premises application”选项。使用作为应用程序标识符的内部 URL 和您希望用户在外部使用的外部 URL 填写应用程序信息。确保您 select 包含有权访问应用程序的连接器的连接器组 – 如果您只遵循第 0 部分中的步骤并且没有创建新的连接器组,则正确的组是“默认”。

第 2 步:通过“用户和组”菜单将用户分配给应用程序

第 2 部分:配置 SAML 应用程序

第 1 步:添加另一个应用程序,但这次选择非图库应用程序

第2步:由于用户是通过Application Proxy应用分配的,所以这里不需要分配。在属性菜单中,关闭需要用户分配字段。

第 3 步:在相应菜单中配置单点登录设置。选择“基于 SAML 的登录”。提供您的应用程序的应用程序标识符。将回复 URL 作为应用程序代理外部 URL(在第 1 部分的第 1 步中配置)。选择用户标识符的类型并为令牌添加签名证书。 您的应用程序现在可以使用了。它可以通过外部应用程序代理 URL 或通过访问面板访问。