我正在尝试使用以下代码和OpenSaml库从服务提供商元数据文件(SAML 2.0)中检索RoleDescriptor节点:

EntitiesDescriptor entityDescriptors = getConfiguration(providerId);
List<RoleDescriptor> roleDescriptors = (List<RoleDescriptor>) entityDescriptors.getEntityDescriptors().get(0).
            getRoleDescriptors();
EntityDescriptor ed = entityDescriptors.getEntityDescriptors().get(0);
if(roleDescriptors != null && !roleDescriptors.isEmpty()){
    RoleDescriptor r = (RoleDescriptor) roleDescriptors.get(0);
    return roleDescriptors.get(0).getErrorURL();
}


我的问题是变量r的结束类型为org.opensaml.saml2.metadata.impl.SPSSODescriptorImpl而不是org.opensaml.saml2.metadata.impl.RoleDescriptorImpl

这是我正在使用的元数据xml文件:



<EntityDescriptor entityID="http://mysp.com/resource">

    <RoleDescriptor errorURL="http://localhost:8080/dummy-sp/error.jsp">
    </RoleDescriptor>

    <SPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
        <KeyDescriptor use="encryption">
            <EncryptionMethod Algorithm=
                "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256">
            </EncryptionMethod>
        </KeyDescriptor>

        <AssertionConsumerService index="1"
            isDefault="true" Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
            Location="http://localhost:8080/dummy-sp/dummysp" />

    </SPSSODescriptor>

    <Organization>
        <OrganizationName xml:lang="en">Your Service
        </OrganizationName>
        <OrganizationDisplayName xml:lang="en">Your
            Service
        </OrganizationDisplayName>
        <OrganizationURL xml:lang="en">http://sp.example.org/
        </OrganizationURL>
    </Organization>
    <ContactPerson contactType="technical">
        <GivenName>Your</GivenName>
        <SurName>Admin</SurName>
        <EmailAddress>[email protected]</EmailAddress>
    </ContactPerson>

</EntityDescriptor>




最后,扫描了我的Eclipse调试屏幕:



http://imgur.com/01xRD5f

最佳答案

我尝试使用此处描述的方法来验证您的元数据xml。
https://wiki.surfnet.nl/display/OpenConext/Validating+SAML2+metadata

它说该元素(添加元数据名称空间之后)

RoleDescriptor: Schemas validity error : Element '{urn:oasis:names:tc:SAML:2.0:metadata}RoleDescriptor': The type definition is abstract.


正如saml元数据规范所说,


  RoleDescriptor元素是一个抽象扩展点,其中包含旨在为不同角色提供处理通用性的通用描述性信息。可以通过扩展抽象的RoleDescriptorType复杂类型来定义新角色


因此,您的元数据xml中不能包含RoleDescriptor元素。您必须使用规范中描述的具体角色(SSO身份提供程序,SSO服务提供程序,身份验证权限,属性权限,策略决策点,从属关系)或扩展抽象RoleDescriptor。

因此,由于上述原因,org.opensaml.saml2.metadata.impl.RoleDescriptorImpl是opensaml中的抽象类,具体角色的实现扩展了该抽象类。

10-01 05:02