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

Azure active directory 如何处理具有相同实体ID的两个IDP,azure-active-directory,spring-saml,Azure Active Directory,Spring Saml,我需要在spring security saml中声明两个IDP具有相同的实体id。 我的webapp使用spring security saml。 此webapp可通过反向代理后面的2个不同URL访问。 第一个URL是公共的,第二个URL是过滤的。 因此,我声明了2个SP(每个URL一个)。 使用单个IDP(ADFS或Gsuite)时,一切都正常工作 当IDP1和IDP2具有不同的实体ID时,我还使用2个SP和2个IDP正确运行该应用程序,它们具有关联SP1/IDP1和SP2/IDP2 不幸的

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

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

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

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

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

你有办法解决这个问题吗?
Azure是否应该提供唯一的实体id?

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

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

它是如何为我工作的!! 因为Spring saml只适用于唯一的IDP实体ID。因此,为了使它对具有相同实体ID的两个不同IDP具有唯一性,我在其中一个IDP上预先添加了别名,因为我知道别名的用途。 因此,现在我必须在初始化、元数据加载期间的验证和SAML响应验证的某些位置破解entityID

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

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

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

接下来是以颁发者作为原始entityId的SAML响应,我们需要在这里向上下文添加带前缀的别名,以便它使用存储在metadatamanager实体列表中的带前缀的_entityId进行验证。 在本例中,我添加了MySamlHttpPostDecoder,它覆盖HttpPostDecoder.extractResponseInfo以向messageIssuer添加别名。 并且,MySamlWebsProfileConsumerImpl到overirde WebsProfileConsumerImpl.verifyIssuer以使用别名设置issuer.getValue。因此,稍后使用存储的entitId进行的验证将匹配。 在配置中使用此MySamlWebsProfileConsumerImpl和MySamlHttpPostDecoder。要使用MySamlHttpPostDecoder,我需要添加新类MySamlHTTPPostBinding(ParserPool ParserPool、VelocityEngine VelocityEngine、MessageDecoder decoder),该类扩展HTTPPostBinding并将MySamlHttpPostDecoder传递给解码器

希望它对你也有用

这对我来说是多么有用!! 因为Spring saml只适用于唯一的IDP实体ID。因此,为了使它对具有相同实体ID的两个不同IDP具有唯一性,我在其中一个IDP上预先添加了别名,因为我知道别名的用途。 因此,现在我必须在初始化、元数据加载期间的验证和SAML响应验证的某些位置破解entityID

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

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

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

接下来是以颁发者作为原始entityId的SAML响应,我们需要在这里向上下文添加带前缀的别名,以便它使用存储在metadatamanager实体列表中的带前缀的_entityId进行验证。 在本例中,我添加了MySamlHttpPostDecoder,它覆盖HttpPostDecoder.extractResponseInfo以向messageIssuer添加别名。 并且,MySamlWebsProfileConsumerImpl到overirde WebsProfileConsumerImpl.verifyIssuer以使用别名设置issuer.getValue。因此,稍后使用存储的entitId进行的验证将匹配。 在配置中使用此MySamlWebsProfileConsumerImpl和MySamlHttpPostDecoder。要使用MySamlHttpPostDecoder,我需要添加新类MySamlHTTPPostBinding(ParserPool ParserPool、VelocityEngine VelocityEngine、MessageDecoder decoder),该类扩展HTTPPostBinding并将MySamlHttpPostDecoder传递给解码器


希望它对你也有用

这似乎是一个重复的问题,每个帖子在这里:这篇帖子有什么