我需要在spring-security-saml中声明两个具有相同实体ID的IDP。
我的Web应用程序使用spring-security-saml。 反向代理后面的2个不同URL可访问此webapp。 第一个URL是公共的,第二个URL被过滤。 因此,我声明了2个SP(每个URL一个)。 单个IDP(ADFS或Gsuite)一切正常。
当IDP1和IDP2具有不同的实体ID时,我还可以使用具有亲和力SP1 / IDP1和SP2 / IDP2的2个SP和2个IDP正确运行该应用程序。
不幸的是,由于要使用Azure Active Directory, Azure中的每个SAML应用程序都会生成具有自己的IDP元数据和自己的证书,但具有相同的实体ID。
所以我需要在spring-security-saml中声明两个具有相同实体ID的IDP。 阅读代码表明,它不是要像这样工作的(实体id被用作键)。
您有解决此问题的想法吗? Azure是否应提供唯一的实体ID?
答案 0 :(得分:0)
我知道它太旧了,只是找到了,但是对于两个不同的应用程序,您不能为每个租户使用相同的实体ID,因此即使两个应用程序具有相同的实体ID,也要确保它们具有不同的证书,这是很有意义的在不同的租户中
答案 1 :(得分:0)
它如何为我工作! 由于Spring saml仅适用于唯一的IDP实体ID。因此,为了使它对于具有相同实体ID的2个不同IDP唯一,我为其中一个添加了别名,因为我知道该别名是做什么的。 因此,现在我必须在元数据加载期间以及SAML响应验证中的初始化,验证的某些位置修改entityID。
对于成功加载元数据(带有前缀实体ID的元数据)尤其是带有签名元数据的加载。 创建了新的重写的子类MySAMLSignatureProfileValidator SAMLSignatureProfileValidator.validateReferenceURI。 要使用此功能,我需要创建另一个自定义类SamlSignatureValidationFilter,以扩展MYSamlSignatureValidationFilter并在其构造函数中初始化MySAMLSignatureProfileValidator。 当我们将元数据添加到元数据管理器中时,请使用此SamlSignatureValidationFilter。 metadataProvider.setMetadataFilter(new MYSamlSignatureValidationFilter(metadata.getTrustEngine(metadataProvider)));
现在添加另一个自定义类MYSAMLCachingMetadataManager以覆盖initializeProviderFilters并删除setMetadataFilter的逻辑,因为其已如上面的代码中那样设置。
在配置中将MYSAMLCachingMetadataManager用于MetadataManager。 这应该注意saml元数据的加载。
然后进入将发布者作为原始entityId的SAML Response,我们需要在此处向上下文添加前缀别名,以便它与存储在metadatamanager实体列表中的prefixed_entityId进行验证。 在这种情况下,我添加了MySamlHttpPostDecoder,它覆盖了HttpPostDecoder.extractResponseInfo以向messageIssuer添加别名。 并且,MySamlWebSSOProfileConsumerImpl将覆盖WebSSOProfileConsumerImpl.verifyIssuer,以使用别名设置issuer.getValue。因此以后使用存储的entitId进行的验证将匹配。 在配置中使用此MySamlWebSSOProfileConsumerImpl和MySamlHttpPostDecoder。要使用MySamlHttpPostDecoder,我需要添加新的类MySamlHTTPPostBinding(ParserPool parserPool,VelocityEngine velocityEngine,MessageDecoder解码器),该类扩展了HTTPPostBinding,并将MySamlHttpPostDecoder传递给解码器。
希望它也对您有用!