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。

我是否缺少一些基本设置?

有两件事需要解决:

  1. 在 OpenSaml v3 中,许多 class 个实例需要有一个 ID,setId(String) 必须在 initialize()
  2. 之前调用
  3. 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() );
            }
        }
    }