繁体   English   中英

确定哪个身份提供者发送了响应 - OneLogin SAML Java

[英]Identify which Identity Provider sent the response - OneLogin SAML Java

我在 Java 中有 OneLogin 的 SAML 插件。 在尝试处理登录响应时,API 需要在登录请求期间使用的相同设置。 但是,我的 Web 服务器有多个正在运行的实例,因此响应可能会转到与请求不同的服务器。 如果响应未加密,我可以使用InResponseTo属性来跟踪 Web 服务器实例之间的设置。 但是如果响应是加密的,我就无法跟踪设置。

 InResponseTo="ONELOGIN_4fee3b046395c4e751011e97f8900b5273d56685"

如何在收到响应时识别身份提供者的配置? 任何帮助,将不胜感激。

Auth auth = new Auth(settings, request, response); 
// This settings object is needed to decrypt the response
auth.processResponse();
if (!auth.isAuthenticated()) {
   out.println("Not authenticated");
}

如果整个 SAML 响应都被加密,则无法找到发行者。 否则,SAML 响应的“Issuer”元素会告诉您 SAML IdP 的实体 ID。

如果我理解正确,在处理响应时您需要能够识别请求来自哪里?

我认为你应该能够用 RelayState 做到这一点。 在他们的文档中(在https://github.com/onelogin/java-saml )他们如何login()方法可以获取 RelayState 信息:

我们可以为登录函数设置一个 'returnTo' url 参数,它将被转换为一个 'RelayState' 参数

String targetUrl = 'https://example.com';
auth.login(returnTo=targetUrl)

在我看来,调用参数returnTo具有误导性,因为它暗示了不存在的行为。 它应该被称为“relayState”。

当它在响应中返回时,它只是一个额外的请求参数。 在文档中,他们展示了一个使用 RelayState 值来路由响应的示例,但您可以使用该信息做任何您想做的事情:

String relayState = request.getParameter("RelayState");
//do whatever you want based on this request parameter

问题:如果响应未加密,我可以使用 InResponseTo 属性来跟踪 Web 服务器实例之间的设置。

但是如果响应是加密的,我就无法跟踪设置。

如何在收到响应时识别身份提供者的配置?

我需要找到一种方法来在不使用会话的情况下跟踪请求将发送到哪个 IDP。

回答

(1) 每个 IdP 需要将 SAML 响应发布到 AttributeConsumingService 端点,例如https://sp.example.org/Shibboleth.sso/SAML2/POST

(2) 不同的IdP应该有不同的entityID。

(3) SAML 2 支持对断言、NameID 和属性进行加密。

(4)引用“如何在收到响应时识别身份提供者的配置?”

IdP 是否加密断言、NameID 或/和属性由 SP 确定。 不同的 SAML SP 可能有不同的要求,例如签名断言或签名响应或加密断言、NameID 或/和属性。

SAML IdP 需要提供相应的配置以满足 SAML SP 的要求。 GitHub 存储库中 Shibboleth IdP 的依赖方/SP 配置为选定的 SAML SP 提供了配置示例。

如果 SP 对不同的 IdP 有不同的要求,则 SP 在接收响应时使用 IdP 的 entityID 来标识身份提供商的配置。

(5) 多个 IdP 可以向同一个 ACS 发送响应。 通常每次 SP 登录,只有一个 IdP 向 ACS 发送 SAML 响应。 然后 SP 使用自己的私钥解密断言、NameID 或属性。

解决方案(部分商业 SAML SP 采用此解决方案):

为不同的 IdP 创建不同的 AttributeConsumingService 端点,即

https://your-sp.com/SAML2/POST/idp1

https://your-sp.com/SAML2/POST/idp2

https://your-sp.com/SAML2/POST/idp3

然后不同的 IdP 将 SAML 响应发布到不同的 AttributeConsumingService 端点。

SP 使用自己的私钥/证书来解密断言、NameID 或属性,然后在不使用会话的情况下跟踪请求将发送到哪个 IDP。

请注意, SP 需要向不同的 IdP 提供具有不同 ACS URL 的不同 SP 元数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM