【问题标题】:How to deal with two IDPs having the same entity ID如何处理具有相同实体 ID 的两个 IDP
【发布时间】: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 吗?

【问题讨论】:

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

标签: azure-active-directory spring-saml


【解决方案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 传递给解码器。

    希望它也对你有用!!!

    【讨论】:

      猜你喜欢
      • 2013-03-03
      • 1970-01-01
      • 2016-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      相关资源
      最近更新 更多