OpenSAML3.3 的正确读取方式(adfs) FederationService.xml?
OpenSAML3.3 Correct way to read (adfs) FederationService.xml?
我正在我的应用程序中集成 OpenSAML 3.3,而不是硬编码所有 url 等,我希望能够使用配置 XMLs。
我得到了一个用于 adfs 实例的 XML 文件,它是 'FederationMetadata.xml'
这是我用来阅读的片段:
InitializationService.initialize();
FilesystemMetadataResolver idpMetaDataProvider = new FilesystemMetadataResolver( new File("/home/raudenaerde/sso/FederationMetadata.xml") );
idpMetaDataProvider.setRequireValidMetadata(true);
idpMetaDataProvider.setParserPool(new BasicParserPool());
idpMetaDataProvider.initialize();
但是,这给了我这个错误:
> Exception in thread "main"
> net.shibboleth.utilities.java.support.component.ComponentInitializationException:
> Component identifier can not be null
使用一个使用 OpenSAML 2.6.4 的 github 项目 (https://github.com/coveo/saml-client) 我阅读它没有问题,但我想坚持使用最新版本 3.3。
我是否缺少一些基本设置?
有两件事需要解决:
- 在 OpenSaml v3 中,许多 class 个实例需要有一个 ID,
setId(String)
必须在 initialize()
之前调用
BasicParserPool
也需要初始化。
完整的工作代码:
InitializationService.initialize();
FilesystemMetadataResolver idpMetaDataProvider = new FilesystemMetadataResolver( new File( "/home/raudenaerde/sso/FederationMetadata.xml" ) );
idpMetaDataProvider.setRequireValidMetadata( true );
idpMetaDataProvider.setId( "myId" );
BasicParserPool pool = new BasicParserPool();
pool.initialize();
idpMetaDataProvider.setParserPool( pool );
idpMetaDataProvider.initialize();
for ( EntityDescriptor idpEntityDescriptor : idpMetaDataProvider )
{
System.out.println( idpEntityDescriptor.getID() );
for ( SingleSignOnService sss : idpEntityDescriptor.getIDPSSODescriptor( SAMLConstants.SAML20P_NS ).getSingleSignOnServices() )
{
if ( sss.getBinding().equals( SAMLConstants.SAML2_REDIRECT_BINDING_URI ) )
{
System.out.println( sss.getLocation() );
}
}
for ( ArtifactResolutionService ars : idpEntityDescriptor.getIDPSSODescriptor( SAMLConstants.SAML20P_NS ).getArtifactResolutionServices() )
{
if ( ars.getBinding().equals( SAMLConstants.SAML2_SOAP11_BINDING_URI ) )
{
System.out.println( ars.getLocation() );
}
}
}
我正在我的应用程序中集成 OpenSAML 3.3,而不是硬编码所有 url 等,我希望能够使用配置 XMLs。
我得到了一个用于 adfs 实例的 XML 文件,它是 'FederationMetadata.xml'
这是我用来阅读的片段:
InitializationService.initialize();
FilesystemMetadataResolver idpMetaDataProvider = new FilesystemMetadataResolver( new File("/home/raudenaerde/sso/FederationMetadata.xml") );
idpMetaDataProvider.setRequireValidMetadata(true);
idpMetaDataProvider.setParserPool(new BasicParserPool());
idpMetaDataProvider.initialize();
但是,这给了我这个错误:
> Exception in thread "main" > net.shibboleth.utilities.java.support.component.ComponentInitializationException: > Component identifier can not be null
使用一个使用 OpenSAML 2.6.4 的 github 项目 (https://github.com/coveo/saml-client) 我阅读它没有问题,但我想坚持使用最新版本 3.3。
我是否缺少一些基本设置?
有两件事需要解决:
- 在 OpenSaml v3 中,许多 class 个实例需要有一个 ID,
setId(String)
必须在initialize()
之前调用
BasicParserPool
也需要初始化。
完整的工作代码:
InitializationService.initialize();
FilesystemMetadataResolver idpMetaDataProvider = new FilesystemMetadataResolver( new File( "/home/raudenaerde/sso/FederationMetadata.xml" ) );
idpMetaDataProvider.setRequireValidMetadata( true );
idpMetaDataProvider.setId( "myId" );
BasicParserPool pool = new BasicParserPool();
pool.initialize();
idpMetaDataProvider.setParserPool( pool );
idpMetaDataProvider.initialize();
for ( EntityDescriptor idpEntityDescriptor : idpMetaDataProvider )
{
System.out.println( idpEntityDescriptor.getID() );
for ( SingleSignOnService sss : idpEntityDescriptor.getIDPSSODescriptor( SAMLConstants.SAML20P_NS ).getSingleSignOnServices() )
{
if ( sss.getBinding().equals( SAMLConstants.SAML2_REDIRECT_BINDING_URI ) )
{
System.out.println( sss.getLocation() );
}
}
for ( ArtifactResolutionService ars : idpEntityDescriptor.getIDPSSODescriptor( SAMLConstants.SAML20P_NS ).getArtifactResolutionServices() )
{
if ( ars.getBinding().equals( SAMLConstants.SAML2_SOAP11_BINDING_URI ) )
{
System.out.println( ars.getLocation() );
}
}
}