2017-05-23 44 views
0

我正在將OpenSAML 3.3集成到我的應用程序中,而不是對所有網址進行硬編碼等,我希望能夠使用配置XML。OpenSAML3.3正確的讀取方式(adfs)FederationService.xml?

我得到這樣一個XML文件,一個ADFS例如,它是「FederationMetadata.xml」

這是我以前看過它的片斷:

InitializationService.initialize(); 
    FilesystemMetadataResolver idpMetaDataProvider = new FilesystemMetadataResolver(new File("/home/raudenaerde/sso/FederationMetadata.xml")); 
    idpMetaDataProvider.setRequireValidMetadata(true); 
    idpMetaDataProvider.setParserPool(new BasicParserPool()); 
    idpMetaDataProvider.initialize(); 

然而,這給了我這個錯誤:在線程「主」 net.shibboleth.utilities.java.support.component.ComponentInitializationException

例外:組件標識符不能爲空

使用使用OpenSAML 2.6.4的github項目(https://github.com/coveo/saml-client)我沒有讀過它的問題,但我想堅持使用最新版本3.3。

我錯過了一些基本的設置?

回答

0

有2件事,需要進行修正:

  1. 在OpenSaml V3許多類實例都需要有一個ID,setId(String)前必須initialize()
  2. 被以及初始化的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()); 
      } 
     } 
    }