使用 spring-security-saml 在 RP 元数据中包含必需的声明
Include required claims in RP metadata using spring-security-saml
有没有办法使用 spring-security-saml 在依赖方的元数据响应中包含所需的声明?
理想情况下,我想向各种 IdP 提供联合元数据 URL,它还指定我们需要哪些声明类型作为 RP(即电子邮件地址、名字、姓氏等)。我目前正在使用 ADFS 作为身份提供者进行测试。使用 RP 元数据 URL 通过向导添加依赖方信任时,除 "Accepted Claims" 选项卡外,大多数信息都已预填。
我已尝试手动修改元数据 xml(如 the docs 中指定)以在 RoleDescriptor 中包含 ClaimTypesRequired 或 ClaimTypesRequested 元素,但我不确定要添加什么...如果可能的话,我也更愿意坚持使用自动生成的元数据。
我对 RP 元数据的理解 URL 正确吗?或者我会更好地向 IdP 提供 URL 然后告诉他们添加额外的声明。
对于自动生成的 Spring SAML 元数据中请求的声明没有开箱即用的支持。但是您可以根据需要扩展 MetadataGenerator class 以导出其他数据。
感谢 Vladimír 的建议,我扩展了 MetadataGenerator class 以添加 AttributeConsumingService 和 RequestedAttribute 元素,如下所示。我将它张贴在这里以防它对任何人有帮助。
public class MySAMLMetadataGenerator extends MetadataGenerator
{
@Override
protected SPSSODescriptor buildSPSSODescriptor(String entityBaseURL, String entityAlias, boolean requestSigned, boolean wantAssertionSigned, Collection<String> includedNameID)
{
SPSSODescriptor descriptor = super.buildSPSSODescriptor(entityBaseURL, entityAlias, requestSigned, wantAssertionSigned, includedNameID);
descriptor.getAttributeConsumingServices().add(generateConsumingService());
return descriptor;
}
private AttributeConsumingService generateConsumingService()
{
SAMLObjectBuilder<AttributeConsumingService> builder = (SAMLObjectBuilder<AttributeConsumingService>) builderFactory.getBuilder(AttributeConsumingService.DEFAULT_ELEMENT_NAME);
AttributeConsumingService service = builder.buildObject();
SAMLObjectBuilder<ServiceName> builder2 = (SAMLObjectBuilder<ServiceName>) builderFactory.getBuilder(ServiceName.DEFAULT_ELEMENT_NAME);
ServiceName serviceName = builder2.buildObject();
serviceName.setName(new LocalizedString("application name", "en"));
service.getNames().add(serviceName);
SAMLObjectBuilder<ServiceDescription> builder3 = (SAMLObjectBuilder<ServiceDescription>) builderFactory.getBuilder(ServiceDescription.DEFAULT_ELEMENT_NAME);
ServiceDescription serviceDescription = builder3.buildObject();
serviceDescription.setDescription(new LocalizedString("Application description", "en"));
service.getDescriptions().add(serviceDescription);
SAMLObjectBuilder<RequestedAttribute> builder4 = (SAMLObjectBuilder<RequestedAttribute>) builderFactory.getBuilder(RequestedAttribute.DEFAULT_ELEMENT_NAME);
RequestedAttribute nameId = builder4.buildObject();
nameId.setIsRequired(true);
nameId.setFriendlyName("Name ID");
nameId.setName("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier");
nameId.setNameFormat("urn:oasis:names:tc:SAML:2.0:attrname-format:uri");
service.getRequestAttributes().add(nameId);
RequestedAttribute email = builder4.buildObject();
email.setIsRequired(true);
email.setFriendlyName("E-Mail Address");
email.setName("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress");
email.setNameFormat("urn:oasis:names:tc:SAML:2.0:attrname-format:uri");
service.getRequestAttributes().add(email);
RequestedAttribute givenName = builder4.buildObject();
givenName.setIsRequired(true);
givenName.setFriendlyName("Given Name");
givenName.setName("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname");
givenName.setNameFormat("urn:oasis:names:tc:SAML:2.0:attrname-format:uri");
service.getRequestAttributes().add(givenName);
RequestedAttribute surname = builder4.buildObject();
//surname.setIsRequired(true);
surname.setFriendlyName("Surname");
surname.setName("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname");
surname.setNameFormat("urn:oasis:names:tc:SAML:2.0:attrname-format:uri");
service.getRequestAttributes().add(surname);
service.setIndex(1);
return service;
}
}
不幸的是,Microsoft ADFS 服务器对这些属性进行了自动设置声明。所以不要像我一样浪费时间尝试让它工作!
有没有办法使用 spring-security-saml 在依赖方的元数据响应中包含所需的声明?
理想情况下,我想向各种 IdP 提供联合元数据 URL,它还指定我们需要哪些声明类型作为 RP(即电子邮件地址、名字、姓氏等)。我目前正在使用 ADFS 作为身份提供者进行测试。使用 RP 元数据 URL 通过向导添加依赖方信任时,除 "Accepted Claims" 选项卡外,大多数信息都已预填。
我已尝试手动修改元数据 xml(如 the docs 中指定)以在 RoleDescriptor 中包含 ClaimTypesRequired 或 ClaimTypesRequested 元素,但我不确定要添加什么...如果可能的话,我也更愿意坚持使用自动生成的元数据。
我对 RP 元数据的理解 URL 正确吗?或者我会更好地向 IdP 提供 URL 然后告诉他们添加额外的声明。
对于自动生成的 Spring SAML 元数据中请求的声明没有开箱即用的支持。但是您可以根据需要扩展 MetadataGenerator class 以导出其他数据。
感谢 Vladimír 的建议,我扩展了 MetadataGenerator class 以添加 AttributeConsumingService 和 RequestedAttribute 元素,如下所示。我将它张贴在这里以防它对任何人有帮助。
public class MySAMLMetadataGenerator extends MetadataGenerator
{
@Override
protected SPSSODescriptor buildSPSSODescriptor(String entityBaseURL, String entityAlias, boolean requestSigned, boolean wantAssertionSigned, Collection<String> includedNameID)
{
SPSSODescriptor descriptor = super.buildSPSSODescriptor(entityBaseURL, entityAlias, requestSigned, wantAssertionSigned, includedNameID);
descriptor.getAttributeConsumingServices().add(generateConsumingService());
return descriptor;
}
private AttributeConsumingService generateConsumingService()
{
SAMLObjectBuilder<AttributeConsumingService> builder = (SAMLObjectBuilder<AttributeConsumingService>) builderFactory.getBuilder(AttributeConsumingService.DEFAULT_ELEMENT_NAME);
AttributeConsumingService service = builder.buildObject();
SAMLObjectBuilder<ServiceName> builder2 = (SAMLObjectBuilder<ServiceName>) builderFactory.getBuilder(ServiceName.DEFAULT_ELEMENT_NAME);
ServiceName serviceName = builder2.buildObject();
serviceName.setName(new LocalizedString("application name", "en"));
service.getNames().add(serviceName);
SAMLObjectBuilder<ServiceDescription> builder3 = (SAMLObjectBuilder<ServiceDescription>) builderFactory.getBuilder(ServiceDescription.DEFAULT_ELEMENT_NAME);
ServiceDescription serviceDescription = builder3.buildObject();
serviceDescription.setDescription(new LocalizedString("Application description", "en"));
service.getDescriptions().add(serviceDescription);
SAMLObjectBuilder<RequestedAttribute> builder4 = (SAMLObjectBuilder<RequestedAttribute>) builderFactory.getBuilder(RequestedAttribute.DEFAULT_ELEMENT_NAME);
RequestedAttribute nameId = builder4.buildObject();
nameId.setIsRequired(true);
nameId.setFriendlyName("Name ID");
nameId.setName("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier");
nameId.setNameFormat("urn:oasis:names:tc:SAML:2.0:attrname-format:uri");
service.getRequestAttributes().add(nameId);
RequestedAttribute email = builder4.buildObject();
email.setIsRequired(true);
email.setFriendlyName("E-Mail Address");
email.setName("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress");
email.setNameFormat("urn:oasis:names:tc:SAML:2.0:attrname-format:uri");
service.getRequestAttributes().add(email);
RequestedAttribute givenName = builder4.buildObject();
givenName.setIsRequired(true);
givenName.setFriendlyName("Given Name");
givenName.setName("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname");
givenName.setNameFormat("urn:oasis:names:tc:SAML:2.0:attrname-format:uri");
service.getRequestAttributes().add(givenName);
RequestedAttribute surname = builder4.buildObject();
//surname.setIsRequired(true);
surname.setFriendlyName("Surname");
surname.setName("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname");
surname.setNameFormat("urn:oasis:names:tc:SAML:2.0:attrname-format:uri");
service.getRequestAttributes().add(surname);
service.setIndex(1);
return service;
}
}
不幸的是,Microsoft ADFS 服务器