如何处理具有相同实体 ID 的两个 IDP

Posted

技术标签:

【中文标题】如何处理具有相同实体 ID 的两个 IDP【英文标题】:How to deal with two IDPs having the same entity ID 【发布时间】:2019-10-07 23:19:06 【问题描述】:

我需要在 spring-security-saml 中声明 2 个具有相同实体 ID 的 IDP。

我的 webapp 使用 spring-security-saml。 这个 webapp 可以通过反向代理后面的 2 个不同的 URL 访问。 第一个 URL 是公开的,第二个 URL 是过滤的。 因此,我声明了 2 个 SP(每个 URL 一个)。 使用单个 IDP(ADFS 或 Gsuite)一切正常。

当 IDP1 和 IDP2 具有不同的实体 ID 时,我还使用 2 个 SP 和 2 个具有亲和力 SP1/IDP1 和 SP2/IDP2 的 IDP 正确运行应用程序。

不幸的是,由于想要使用 Azure Active Directory,Azure 中的每个 SAML 应用程序都会生成其自己的 IDP 元数据,并具有自己的证书,但具有相同的实体 ID。

所以我需要在 spring-security-saml 中声明 2 个具有相同实体 ID 的 IDP。 阅读代码表明它不打算这样工作(实体id用作键)。

您有解决此问题的想法吗? Azure 应该提供唯一的实体 ID 吗?

【问题讨论】:

看起来这是每个帖子的重复问题:***.com/questions/26010813/… 这个 SO Post 是否有任何内容无法回答您关于使用 spring-security-saml 的多个 IDps 的问题? 【参考方案1】:

我知道它太旧了,但刚刚找到它,但您不能为 2 个不同的应用程序为每个租户使用相同的实体 ID,因此即使它们具有相同的实体 ID,应用程序具有不同的证书也是有道理的,因为这两个应用程序在不同的租户中

【讨论】:

【参考方案2】:

它对我有什么作用!! 由于 Spring saml 仅适用于唯一 IDP entityIds。因此,为了使其对于具有相同实体 ID 的 2 个不同的 IDP 而言是唯一的,我使用别名作为其中一个前缀,因为我知道该别名的用途是什么。 所以现在我必须在某些初始化位置、元数据加载期间的验证和 SAML 响应验证中破解 entityID。

为了使元数据(具有前缀实体 ID 的)加载成功,尤其是带有签名元数据的元数据。 创建了覆盖的新子类 MySAMLSignatureProfileValidator SAMLSignatureProfileValidator.validateReferenceURI。 要使用它,我需要创建另一个扩展 MYSamlSignatureValidationFilter 的自定义类 SamlSignatureValidationFilter 并在其构造函数中初始化 MySAMLSignatureProfileValidator。 当我们像这样将元数据添加到元数据管理器时使用这个 SamlSignatureValidationFilter.. metadataProvider.setMetadataFilter(new MYSamlSignatureValidationFilter(metadata.getTrustEngine(metadataProvider)));

现在添加另一个自定义类 MYSAMLCachingMetadataManager 来覆盖 initializeProviderFilters 并删除 setMetadataFilter 的逻辑,因为它已经在上面的代码中设置。

在您的 MetadataManager 配置中使用 MYSAMLCachingMetadataManager。 这应该负责 saml 元数据加载。

然后来到以颁发者为原始 entityId 的 SAML 响应,我们需要在此处向上下文添加前缀别名,以便它使用存储在 metadatamanager 实体列表中的 prefixed_entityId 进行验证。 在这种情况下,我添加了覆盖 HttpPostDecoder.extractResponseInfo 的 MySamlHttpPostDecoder 以向 messageIssuer 添加别名。 并且, MySamlWebSSOProfileConsumerImpl 覆盖 WebSSOProfileConsumerImpl.verifyIssuer 以使用别名设置 issuer.getValue。因此稍后使用存储的entitId 进行的验证将匹配。 在您的配置中使用此 MySamlWebSSOProfileConsumerImpl 和 MySamlHttpPostDecoder。要使用 MySamlHttpPostDecoder,我需要添加扩展 HTTPPostBinding 的新类 MySamlHTTPPostBinding(ParserPool parserPool, VelocityEngine velocityEngine, MessageDecoder decoder) 并将 MySamlHttpPostDecoder 传递给解码器。

希望它也对你有用!!!

【讨论】:

以上是关于如何处理具有相同实体 ID 的两个 IDP的主要内容,如果未能解决你的问题,请参考以下文章

spring saml:LOGOUT 是如何处理的?是不是必须在 IDP 元数据 xml 中有注销端点?

在电源查询中加载 CSV 时如何处理多个引号?

如何处理具有相似属性的维度?

如何处理自定义 UITableViewCell XIB 中的两个视图?

OpenID Connect 如何处理服务链?

如何处理使用相同数据库的两个独立 laravel 项目的迁移?