我正在尝试使用以下代码和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中的抽象类,具体角色的实现扩展了该抽象类。