SAML 2.0 Metadata

Spring Security 可以剖析宣告方 Metadata 以產生 AssertingPartyDetails 實例,以及發佈依賴方 MetadataRelyingPartyRegistration 實例。

剖析 <saml2:IDPSSODescriptor> Metadata

您可以剖析宣告方的 Metadata 使用 RelyingPartyRegistrations

當使用 OpenSAML 供應商支援時,產生的 AssertingPartyDetails 將為 OpenSamlAssertingPartyDetails 類型。這表示您將能夠透過執行以下操作來取得底層的 OpenSAML XMLObject

  • Java

  • Kotlin

OpenSamlAssertingPartyDetails details = (OpenSamlAssertingPartyDetails)
        registration.getAssertingPartyDetails();
EntityDescriptor openSamlEntityDescriptor = details.getEntityDescriptor();
val details: OpenSamlAssertingPartyDetails =
        registration.getAssertingPartyDetails() as OpenSamlAssertingPartyDetails;
val openSamlEntityDescriptor: EntityDescriptor = details.getEntityDescriptor();

產生 <saml2:SPSSODescriptor> Metadata

您可以使用 saml2Metadata DSL 方法發佈 Metadata 端點,如下所示

  • Java

  • Kotlin

http
    // ...
    .saml2Login(withDefaults())
    .saml2Metadata(withDefaults());
http {
    //...
    saml2Login { }
    saml2Metadata { }
}

您可以使用此 Metadata 端點向宣告方註冊您的依賴方。這通常就像找到正確的表單欄位來提供 Metadata 端點一樣簡單。

預設情況下,Metadata 端點為 /saml2/metadata,但它也會回應 /saml2/metadata/{registrationId}/saml2/service-provider-metadata/{registrationId}

您可以透過在 DSL 中呼叫 metadataUrl 方法來變更此設定

  • Java

  • Kotlin

.saml2Metadata((saml2) -> saml2.metadataUrl("/saml/metadata"))
saml2Metadata {
	metadataUrl = "/saml/metadata"
}

變更 RelyingPartyRegistration 的查找方式

如果您有不同的策略來識別要使用哪個 RelyingPartyRegistration,您可以組態您自己的 Saml2MetadataResponseResolver,如下所示

  • Java

  • Kotlin

@Bean
Saml2MetadataResponseResolver metadataResponseResolver(RelyingPartyRegistrationRepository registrations) {
	RequestMatcherMetadataResponseResolver metadata = new RequestMatcherMetadataResponseResolver(
			(id) -> registrations.findByRegistrationId("relying-party"));
	metadata.setMetadataFilename("metadata.xml");
	return metadata;
}
@Bean
fun metadataResponseResolver(val registrations: RelyingPartyRegistrationRepository): Saml2MetadataResponseResolver {
    val metadata = new RequestMatcherMetadataResponseResolver(
			id: String -> registrations.findByRegistrationId("relying-party"))
	metadata.setMetadataFilename("metadata.xml")
	return metadata
}