Spring Security Saml Reference
Spring Security Saml Reference
Reference Documentation
1.0.10.RELEASE
Vladimír Schäfer
Copyright © 2009-2014 Vladimír Schäfer
Spring Security SAML Extension
Table of Contents
I. Getting Started ....................................................................................................................... 1
1. Introduction .................................................................................................................... 2
1.1. What this manual covers ..................................................................................... 2
1.2. When to use Spring Security SAML Extension ...................................................... 2
1.3. Features and supported profiles ........................................................................... 2
1.4. Requirements ...................................................................................................... 3
1.5. Source code ........................................................................................................ 3
1.6. Builds ................................................................................................................. 3
1.7. License ............................................................................................................... 3
1.8. Issue tracking ...................................................................................................... 3
1.9. Contributions ....................................................................................................... 3
1.10. Commercial support ........................................................................................... 3
1.11. Community support ............................................................................................ 4
1.12. Dependencies ................................................................................................... 4
2. What's new .................................................................................................................... 5
2.1. New features, improvements and fixes in 1.0.1.FINAL ........................................... 5
2.2. New features, improvements and fixes in 1.0.0.FINAL ........................................... 5
2.3. Important code changes in 1.0.0.FINAL ................................................................ 6
3. Glossary ........................................................................................................................ 8
4. Quick start guide .......................................................................................................... 10
4.1. Pre-requisites .................................................................................................... 10
4.2. Installation steps ................................................................................................ 10
Downloading sample application ....................................................................... 10
Configuration of IDP metadata .......................................................................... 10
Generation of SP metadata .............................................................................. 11
Compilation ...................................................................................................... 11
Deployment ...................................................................................................... 11
Uploading of SP metadata to the IDP ................................................................ 11
4.3. Testing single sign-on and single logout .............................................................. 12
II. Configuring SAML Extension ................................................................................................ 13
5. Overview ...................................................................................................................... 14
6. Integration to applications ............................................................................................. 15
6.1. Maven dependency ........................................................................................... 15
6.2. Bean definitions ................................................................................................. 15
6.3. Java-based configuration ................................................................................... 15
6.4. Spring Security integration ................................................................................. 15
6.5. Error handling ................................................................................................... 16
6.6. Logging ............................................................................................................. 16
7. Metadata configuration ................................................................................................. 17
7.1. Service provider metadata ................................................................................. 17
Automatic metadata generation ......................................................................... 17
Pre-configured metadata ................................................................................... 19
Downloading metadata ..................................................................................... 20
7.2. Identity provider metadata .................................................................................. 21
File-based metadata provider ............................................................................ 21
HTTP-based metadata provider ......................................................................... 21
HTTP-based metadata provider with SSL .......................................................... 21
1. Introduction
1.1 What this manual covers
This manual describes Spring Security SAML Extension component, its uses, installation, configuration,
design and integration possibilities.
The extension can also be used in applications which are not primarily secured using Spring Security.
It can be adapted for both single and multi-tenant environments.
The extension can be either embedded inside your application and work along other authentication or
single sign-on mechanisms, or it can be deployed separately and convey authentication information to
applications using a custom mechanism.
The extension is probably the most complete open-source SAML 2.0 SP implementation with the widest
feature-set and configuration possibilities. Other Java open-source alternatives are e.g. native SAML
service providers integrating with IIS or Apache from Shibboleth (SAML processing is done on the web
server and not on the application level) or OpenAM Fedlet.
eGovernment profile
• https://kantarainitiative.org/confluence/download/attachments/42139782/kantara-egov-saml2-
profile-2.0.pdf
1.4 Requirements
Spring Security SAML Extension requires as a minimum Java 1.6 and is known to work with most Java
containers and application servers. It can also be used with PaaS providers, such as Google App Engine,
please see https://github.com/vschafer/spring-security-saml-gae for details.
1.6 Builds
Snapshot builds of the project are available in the SpringSource repository. We use Bamboo for
continuous integration.
1.7 License
Source code of the module is licensed under the Apache License, Version 2.0. You may obtain copy of
the license at https://www.apache.org/licenses/LICENSE-2.0.
1.9 Contributions
Please send your pull requests directly to GitHub and preferably also open issue in Jira.
1.12 Dependencies
Internal processing of SAML messages, marshalling and unmarshalling is handled by OpenSAML.
2. What's new
This section contains overview of important changes for released versions of Spring SAML.
• Metadata signing now supports custom keyInfoGenerator and signingAlgorithm, signing can be
enable per-entity
• SAMLContextProvider has new customization possibilities for PKIXTrustEvaluator,
PKIXInformationResolver and MetadataResolver
• CertPathPKIXTrustEvaluator supports customization of security provider and explicit validation of
certification path
• MetadataCredentialResolver can be configured to load data from XML metadata and/or
ExtendedMetadata
• PKIXInformationResolver has an extension point for population of CRLs
• Improvements to logging and error handling, profile implementations now throw exceptions which are
logged inside filter objects and fail with ServletExceptions, sample application newly shows handling
of these errors
• Used OpenSAML version was updated to 2.6.1
• SAMLDefaultLogger now logs additional information such as NameID
• Enabled propagation of defaults (e.g. ProxySettings) set in the HttpClient object for ArtifactResolution
• JKSKeyManager now supports keystores without password
• SAMLContextProviderLB now supports empty contextPath and includes pathInfo data for requests
• Entity ID and EntityDescriptor ID can now be set separately in MetadataGenerator
• ECP now takes precedence over discovery in SAMLEntryPoint
• Signing of local metadata is now done before displaying, this enables manual modifications to
metadata in local files
• ArtifactResolutionProfileImpl now support customization of used SocketFactory through extensions
• ID in generated metadata is now automatically created when null, ID is based on entityID cleaned
in order to conform to xsd:ID (and xsd:NCName) type, EntityID is cleaned by replacing all illegal
characters by underscores
• Support for hostname verification in artifact resolution
• Completed documentation
• Possibility to exclude the SAML Credential from the Authentication object
• Disabled deferred node expansion for ParserPool which improves performance in parsing of small
XML documents
• HttpSessionStorage is now cleared after successful reception of a message in order to save memory
• Possibility to include attributes from only the authenticated Assertion, or from all
• New socket factory for trust verification during loading of metadata from HTTPS
• Possibility to disable support for IDP-initialized SSO
• Usage of metadata alias is now optional
• New look and feel of the sample application
• Cleanup of duplicate values in MetadataGenerator and ExtendedMetadata
• SAMLCredential now contains facility methods for handling of String SAML attributes
Module names
• module saml2-core was renamed to core, jar and maven artifact names stay the same
• module saml2-sample was renamed to sample, jar and maven artifact names stay the same
• module src was renamed to docs, jar and maven artifact names stay the same
Descriptor securityContext.xml
• file saml2-sample/src/main/resources/security/securityContext.xml was moved to sample/src/main/
webapp/WEB-INF/securityContext.xml
• administration part of the UI is now secured with username/password
• updated initialization of ParserPool to disable defer node expansion
• HttpClient in ArtifactResolution was made thread safe
• added new failure handler (failureRedirectHandler)
• MetadataGenerator bean now demonstrates usage of ExtendedMetadata
• FilesystemMetadataProvider was replaced with ResourceBackedMetadataProvider
• file sample/src/main/resources/security/idp.xml was moved to sample/src/main/resources/metadata/
idp.xml
ArtifactResolutionProfileBase
• throws SAMLException instead of CredentialExpiredException on check of artifact response issue
instant
HttpSessionStorage
• storage is now cleared on successful message reception
MetadataDisplayFilter
• new mandatory property KeyManager (autowired)
MetadataGenerator
• generated metadata is no longer signed by default (enable in ExtendedMetadata.signMetadata) and
has disabled IDP discovery (enable in ExtendedMetadata.includeDiscovery)
• the following fields were moved from MetadataGenerator to ExtendedMetadata:
• entityAlias -> alias
• signMetadata -> signMetadata
• signingKey -> signingKey
• encryptionKey -> encryptionKey
• tlsKey -> tlsKey
• includeDiscovery -> idpDiscoveryEnabled
SAMLAuthenticationProvider
• property forcePrincipalAsString is now set to true by default
SAMLCredential
• method getAttributeByName was renamed to getAttribute
SAMLDiscovery
• fails with ServletException instead of SAMLRuntimeException
SAMLLogoutProcessingFilter
• throws ServletException on errors during acceptance of LogoutRequest instead of
SAMLRuntimeException
SAMLUtil
• removed unused getDefaultBinding method
SingleLogoutProfileImpl
• sendLogoutResponse signature changed
• changed error handling, throws SAMLStatusException which is handled by Filter, logged and sends
a SAML Response
WebSSOProfileImpl
• throws SAMLException instead of SAMLRuntimeException on missing data in context
WebSSOProfileConsumerImpl
• new property includeAllAttributes, set to true for original behavior
• throws SAMLException instead of CredentialExpiredException on check of response issue instant
and assertion issue instant
3. Glossary
Table 3.1. Definitions of terms used within this manual
Term Definition
Assertion A part of SAML message (an XML document) which provides facts
about subject of the assertion (typically about the authenticated user).
Assertions can contain information about authentication, associated
attributes or authorization decisions.
Identity provider (IDP) Entity which knows how to authenticate users and provides information
about their identity to service providers/relaying parties using
federation protocols.
Service provider (SP) Your application which communicates with the identity provider in
order to obtain information about the user it interacts with. User
information such as authentication state and user attributes is provided
in form of security assertions.
Single Sign-On (SSO) Process enabling access to multiple web sites without need to
repeatedly present credentials necessary for authentication. Various
federation protocols such as SAML, WS-Federation, OpenID or OAuth
can be used to achieve SSO use-cases. Information such as means
of authentication, user attributes, authorization decisions or security
tokens are typically provided to the service provider as part of single
sign-on.
Term Definition
Single Logout (SLO) Process terminating authenticated sessions at all resources which
were accessed using single sign-on. Techniques such as redirecting
user to each of the SSO participants or sending a logout SOAP
messages are typically used.
4.1 Pre-requisites
Please make sure the following items are available before starting the installation:
• Java 1.6+ SDK
• Apache Maven
SAML Extension relies on XML processing capabilities of JAXP. Some older versions of JRE might
require updating of the embedded JAXP libraries. In case you encounter XML processing exceptions
please create folder jdk/jre/lib/endorsed in your JDK installation and include files in lib/endorsed from the
latest OpenSAML archive available at https://shibboleth.net/downloads/java-opensaml/. The location of
the endorsed folder may differ based on your application server or container.
Due to US export limitations Java JDK comes with a limited set of cryptography capabilities. Usage of
the SAML Extension might require installation of the Unlimited Strength Jurisdiction Policy Files which
removes these limitations.
The Spring SAML Sample application is included in sample directory. We will be customizing content
of the sample application in the following steps.
The settings tell system to download IDP metadata from the given URL with timeout of 5 seconds. In
production system metadata should be either stored as a local file or be downloaded from a source
using SSL/TLS with configured trust or which provides digitally signed metadata.
Generation of SP metadata
Modify file sample/src/main/webapp/WEB-INF/securityContext.xml of the sample application, replace
metadataGeneratorFilter bean as follows and make sure to replace the entityId value with a string which
is unique within the SSO Circle service (e.g. urn:test:yourname:yourcity):
<bean id="metadataGeneratorFilter"
class="org.springframework.security.saml.metadata.MetadataGeneratorFilter">
<constructor-arg>
<bean class="org.springframework.security.saml.metadata.MetadataGenerator">
<property name="entityId" value="replaceWithUniqueIdentifier"/>
<property name="extendedMetadata">
<bean class="org.springframework.security.saml.metadata.ExtendedMetadata">
<property name="signMetadata" value="false"/>
<property name="idpDiscoveryEnabled" value="true"/>
</bean>
</property>
</bean>
</constructor-arg>
</bean>
Compilation
When building from sources compile whole project and install artifacts into your local Maven repository
using:
When using the release zip compile the sample application available in the sample directory using:
mvn package
You can find the compiled war archive spring-security-saml2-sample.war in directory sample/build/libs/
(gradle) or sample/target/ (maven).
Project files for your IDE can be created with gradlew eclipse or gradlew idea.
Deployment
You can start the application from the release sample directory using command:
mvn tomcat7:run
gradlew tomcatRun
After startup the Spring SAML sample application will be available at http://localhost:8080/spring-
security-saml2-sample
Alternatively you can deploy the war archive to your application server or container.
Pressing local logout will destroy local session and logout the user. While a session is still active at the
IDP an attempt to reauthenticate will proceed without need to enter credentials.
Pressing global logout will destroy both local session and the session at IDP.
You can test IDP initialized single sign-on with URL https://idp.ssocircle.com:443/sso/saml2/
jsp/idpSSOInit.jsp?metaAlias=/publicidp&spEntityID=replaceWithUniqueIdentifier, after replacing the
service provider identifier with the one configured as entityId in your securityContext.xml. It is possible
to provide relayState data sent to your SP with parameter RelayState.
5. Overview
Spring Security SAML 2.0 library comprises three modules:
• core contains implementation of the WebSSO profiles of the SAML 2.0 protocol and is required for
integration to target systems.
• sample contains example of Spring configuration used for integration to target systems. It also
contains user interface for generation and management of metadata.
• docs contains this documentation.
Configuration of the library is done using Spring context XML. An example of configuration can be
found under sample/src/main/webapp/WEB-INF/securityContext.xml. Setting up of the library typically
involves these steps:
• integration to application using Spring XML configuration
• import, generation and customization of SP and IDP metadata
• configuration of signature, encryption and trust keys
• configuration of security profiles
• configuration of reverse proxy or load balancer
• configuration of IDP selection or discovery
• configuration of single sign-on process
• configuration of logout process
• configuration of authentication object
• configuration of authentication log
Additional steps such as customization of SAML 2.0 bindings, configuration of artifact resolution or
configuration of time skews might be needed.
6. Integration to applications
SAML module can be directly embedded into new or existing Spring applications. In this case application
itself includes the SAML library in WEB-INF/lib directory of the war archive and processes all SAML
interactions. The other option of using the SAML library is deploying it as a stand-alone module which
transfers information about the authenticated user to the target application using a custom mechanism.
This chapter only discusses the first option.
<dependency>
<groupId>org.springframework.security.extensions</groupId>
<artifactId>spring-security-saml2-core</artifactId>
<version>${version}</version>
</dependency>
The current version of SAML Extension has been tested to work with Spring 3.1.2, Spring Security
3.1.2 and OpenSAML 2.6.1. Later versions of these libraries are likely to be compatible without need
for modifications.
Beans of the SAML library are using auto-wiring and annotation-based configuration by default. Make
sure that your Spring configuration contains e.g. the following settings in order to enable support for
these features:
<context:annotation-config/>
<context:component-scan base-package="org.springframework.security.saml"/>
For an example of securityContext.xml translated into Java configuration in a Spring Boot application
see project by Vincenzo De Notaris at https://github.com/vdenotaris/spring-boot-security-saml-sample.
<security:http entry-point-ref="samlEntryPoint">
<security:custom-filter before="FIRST" ref="metadataGeneratorFilter"/>
<security:custom-filter after="BASIC_AUTH_FILTER" ref="samlFilter"/>
</security:http>
<error-page>
<exception-type>javax.servlet.ServletException</exception-type>
<location>/error.jsp</location>
</error-page>
ServletException contains original reason for the failure as a cause. It is recommended that content of
the exceptions is not displayed to end users, both for security and user experience reasons.
6.6 Logging
SAML Extension uses SLF4J framework for logging. The same applies to the underlying OpenSAML
library. The sample application by default uses log4j version 1.2 binding for SLF4J, configured with the
following dependency:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.3</version>
<scope>compile</scope>
</dependency>
To view the contents of SAML messages and errors from the logs, adjust the settings of the
SAMLDefaultLogger bean.
In case you are using another logging library, make sure to change the dependency accordingly.
You can enable debug logging by modifying file sample/src/main/resources/log4j.properties and adding:
log4j.logger.org.springframework.security.saml=DEBUG
log4j.logger.org.opensaml=DEBUG
log4j.logger.PROTOCOL_MESSAGE=DEBUG
For details about using other logging frameworks please consult the SLF4J manual.
7. Metadata configuration
SAML metadata is an XML document which contains information necessary for interaction with SAML-
enabled identity or service providers. The document contains e.g. URLs of endpoints, information about
supported bindings, identifiers and public keys. Typically one metadata document will be generated
for your own service provider and sent to all identity providers you want to enable single sign-on with.
Similarly, each identity provider will make its own metadata available for you to import into your service
provider application.
Each metadata document can contain definition for one or many identity or service providers and
optionally can be digitally signed. Metadata can be customized either by direct modifications to the XML
document, or using extended metadata. Extended metadata is added directly to the Spring configuration
file and can contain additional options which are unavailable in the basic metadata document.
This filter is automatically invoked as part of the first request to a URL processed by Spring Security. In
case there is no service provider metadata already specified (meaning property hostedSPName of the
metadata bean is empty) filter will generate a new one.
By default metadata will be generated with the following values which can be customized by setting
properties of the metadataGenerator bean:
Table 7.1. Metadata generator settings
entityBaseURL Base URL to construct SAML Values from the request in format:
endpoints from, needs to be a scheme://server:port/contextPath
URL with protocol, server, port and
context path.
In case property entityBaseURL is not specified, it will be automatically generated based on values
in the first HTTP request. Generated value can be normalized to exclude standard 80/443 ports for http/
https schemes by setting property normalizeBaseUrl of the MetadataGeneratorFilter to true. It is
recommended to provide the value explicitly in the configuration.
<bean class="org.springframework.security.saml.metadata.MetadataGenerator">
<property name="bindingsSSO"><list><value>artifact</value></list></property>
<property name="bindingsSLO"><list><value>redirect</value></list></property>
<property name="bindingsHoKSSO"><list/></property>
</bean>
By default generated metadata will not be digitally signed. Digital signature can be enabled using
property signMetadata of the extendedMetadata bean.
In case application is deployed behind a reverse-proxy or other mechanism which makes the URL at
the application server different from the URL seen by client at least property entityBaseURL should
be set to a value e.g. https://www.server.com:8080 For details about load balancing see Section 10.1,
“Reverse proxies and load balancers”.
Pre-configured metadata
In some situations it is beneficial to provide static version of the metadata document instead of the
automatic generation. Need for manual changes in the metadata or fixing of production settings are
some of those. A custom metadata document describing local SP application can be added by updating
the metadata bean with correct ExtendedMetadata. Please follow these steps in order to do so:
• Generate and download metadata, e.g. using the Metadata Administration -> Generate new service
provider metadata option in the sample application's administration UI or using instructions in
automatic metadata generator.
• Store the metadata file as part of your project classpath, e.g. in WEB-INF/classes/metadata/
localhost_sp.xml.
• Disable the automatic metadata generator by removing the following custom filter from the
securityContext.xml:
• Include the SP metadata in the metadata bean and mark the entity as local in the extended metadata.
Make sure to specify the alias property in case it was used during metadata generation.
It is recommended to use the administration UI which also generates all the Spring declarations ready
for inclusion in your securityContext.xml.
Configuration for pre-configured local metadata can look for example like this:
<bean class="org.springframework.security.saml.metadata.ExtendedMetadataDelegate">
<constructor-arg>
<bean class="org.opensaml.saml2.metadata.provider.ResourceBackedMetadataProvider">
<constructor-arg>
<bean class="java.util.Timer"/>
</constructor-arg>
<constructor-arg>
<bean class="org.opensaml.util.resource.ClasspathResource">
<constructor-arg value="/metadata/localhost_sp.xml"/>
</bean>
</constructor-arg>
<property name="parserPool" ref="parserPool"/>
</bean>
</constructor-arg>
<constructor-arg>
<bean class="org.springframework.security.saml.metadata.ExtendedMetadata">
<property name="local" value="true"/>
<property name="securityProfile" value="metaiop"/>
<property name="sslSecurityProfile" value="pkix"/>
<property name="signMetadata" value="true"/>
<property name="signingKey" value="apollo"/>
<property name="encryptionKey" value="apollo"/>
<property name="requireArtifactResolveSigned" value="false"/>
<property name="requireLogoutRequestSigned" value="false"/>
<property name="requireLogoutResponseSigned" value="false"/>
<property name="idpDiscoveryEnabled" value="true"/>
<property name="idpDiscoveryURL"
value="https://www.server.com:8080/context/saml/discovery"/>
<property name="idpDiscoveryResponseURL"
value="https://www.server.com:8080/context/saml/login?disco=true"/>
</bean>
</constructor-arg>
</bean>
Same instance of your application can include multiple statically declared local service providers each
differentiated by its own unique alias and entity ID, see Section 7.4, “Multi-tenancy and entity alias” for
details. In case your application defines multiple local service providers, set property hostedSPName
of the metadata bean to the entity ID of the default one.
The file with pre-configured metadata doesn't need to include digital signature. Metadata will be
automatically signed during runtime when property signMetadata is set to true.
For details about available settings of the ExtendedMetadata see Section 7.3, “Extended metadata”.
Downloading metadata
Metadata describing the default local application can be downloaded from URL:
https://www.server.com:8080/context/saml/metadata
In case the application is configured to contain multiple service providers metadata for each can be
loaded by adding the alias:
https://www.server.com:8080/context/saml/login/alias/defaultAlias
URL for metadata download can be disabled by removing filter metadataDisplayFilter from the
securityContext.xml.
Metadata is also available in the sample application's administration UI under Metadata information -
> selected SP.
<bean class="org.springframework.security.saml.metadata.ExtendedMetadataDelegate">
<constructor-arg>
<bean class="org.opensaml.saml2.metadata.provider.FilesystemMetadataProvider">
<constructor-arg>
<value type="java.io.File">classpath:security/idp.xml</value>
</constructor-arg>
<property name="parserPool" ref="parserPool"/>
</bean>
</constructor-arg>
<constructor-arg>
<bean class="org.springframework.security.saml.metadata.ExtendedMetadata"/>
</constructor-arg>
</bean>
<bean class="org.springframework.security.saml.metadata.ExtendedMetadataDelegate">
<constructor-arg>
<bean class="org.opensaml.saml2.metadata.provider.HTTPMetadataProvider">
<constructor-arg>
<value type="java.lang.String">https://idp.ssocircle.com/idp-meta.xml</value>
</constructor-arg>
<constructor-arg>
<!-- Timeout for metadata loading in ms -->
<value type="int">5000</value>
</constructor-arg>
<property name="parserPool" ref="parserPool"/>
</bean>
</constructor-arg>
<constructor-arg>
<bean class="org.springframework.security.saml.metadata.ExtendedMetadata"/>
</constructor-arg>
</bean>
<bean class="org.springframework.security.saml.trust.httpclient.TLSProtocolConfigurer"/>
The socket factory configured in this fashion is used for all metadata providers. It is possible to
customize metadata loading on a per-provider basis by adding a configured HttpClient instance to the
HTTPMetadataProvider constructor.
Importing of digitally signed metadata requires verification of signature's validity and trust. Metadata is
not required to be signed by default. When present, signature is verified with PKIX algorithm and uses
all public keys present in the configured keyManager as trust anchors. Make sure to include root CA
certificate and intermediary CA certificates of the signature in your keyStore. For details see the section
called “Importing public keys”.
You can limit certificates used to perform the verification by setting property metadataTrustedKeys of
the ExtendedMetadataDelegate bean. The provided collection should contain aliases of keys to be used
as trust anchors.
<bean class="org.springframework.security.saml.metadata.ExtendedMetadataDelegate">
<constructor-arg>
metadata provider bean
</constructor-arg>
<constructor-arg>
<!-- Default extended metadata for entities not specified in the map -->
<bean class="org.springframework.security.saml.metadata.ExtendedMetadata"/>
</constructor-arg>
<constructor-arg>
<!-- Extended metadata for specific IDPs -->
<map>
<entry key="https://idp.ssocircle.com">
<bean class="org.springframework.security.saml.metadata.ExtendedMetadata"/>
</entry>
</map>
</constructor-arg>
</bean>
The following table summarizes settings available in the extended metadata. The same class is used
for both local service providers and remote identity providers; each value contains information about
the entities it's valid for.
idpDiscoveryEnabled false local When true system will initialize IDP discovery
only when no IDP is selected during SSO
initialization. See Section 9.1, “IDP selection
and discovery”.
idpDiscoveryURL internal local URL of the IDP discovery service. Only used
discovery only when discovery is enabled.
URL
ecpEnabled false local Property enables support for the SAML 2.0
only ECP profile. See Section 10.4, “Enhanced
client/proxy”.
For additional examples on setting up metadata and extended metadata see Section 7.1, “Service
provider metadata” for local SP, and Section 7.2, “Identity provider metadata” for remote IDPs.
is differentiating between the service provider instances using entity alias which is a unique identifier
within deployment of Spring SAML.
Entity alias is appended to URLs of SAML endpoints and used by Spring SAML to identify
the correct instance. For example for local service provider with entity alias customer123 the
standard URL scheme://server:port/contextPath/saml/login becomes scheme://server:port/contextPath/
saml/login/alias/customer123.
The entity alias functionality can only be used together with pre-configured metadata (see the section
called “Pre-configured metadata”). The entity alias is specified in the extended metadata of each of the
configured service providers.
Spring SAML doesn't enforce any limitations on which Identity Provider can be deliver messages to
which of the local Service Providers. In case your application requires similar rules (for example only
certain tenants can authenticate using a specific IDP), make sure to implement them for example in
your SAMLUserDetailsService (for single sign-on).
Selection of the correct Service Provider instance based on URL is performed inside
SAMLContextProviderImpl class.
8. Security configuration
SAML Extension requires configuration of security settings which include cryptographic material used
for digital signatures and encryption, security profiles for configuration of trusted cryptographic material
provided by remote entities and verifications of HTTPS connections.
In case your application doesn't need to create digital signatures and/or decrypt incoming messages,
it is possible to use an empty implementation of the keystore which doesn't require any JKS file -
org.springframework.security.saml.key.EmptyKeyManager. This can be the case for example when
using only IDP-Initialized single sign-on. Please note that when using the EmptyKeyManager some of
Spring SAML features will be unavailable. This includes at least SP-initialized Single Sign-on, Single
Logout, usage of additional keys in ExtendedMetadata and verification of metadata signatures. Use the
following bean in order to initialize the EmptyKeyManager:
The first argument points to the used key store file, second contains password for the keystore, third
then map with passwords for private keys with alias-password value pairs. Alias of the default certificate
is the last parameter.
In case your IDP doesn't require keys signed by a specific certification authority you can generate your
own self-signed key using the Java utility keytool, e.g. with:
The keystore will now contain additional PrivateKeyEntry with alias mykey which can be imported to the
keyManager in your securityContext.xml.
Keys signed by certification authorities are typically provided in .p12/.pfx format (or can be converted to
such using OpenSSL) and imported to Java keystore with, e.g.:
The following command can be used to determine available alias in the p12 file:
Cryptographic material used to decrypt incoming data and verify trust of signatures in SAML messages
and metadata is stored either in metadata of remote entities or in the keyManager. In order to import
additional trusted key to the keystore run, e.g.:
Direct SSL/TLS connections (used with HTTP-Artifact binding) require verification of the public key
presented by the server. The SSL Extractor utility can be used to extract certificates presented by an
SSL/TLS endpoint, e.g. with:
The certificates are stored as .cer files and can be imported to the keystore as a usual public key. For
details about configuring of trust for SSL/TLS connections see Section 8.2, “Security profiles”.
Verification of signatures is executed in two phases. Signature is first checked for validity by comparing
digital hash included as part of the signature with value calculated from the content. Subsequently it
is verified whether party who created the signature is trusted by the recipient. Spring Security SAML
provides two mechanisms for defining which signatures should be accepted - metadata interoperability
mode and PKIX mode.
Security profiles are defined in Extended Metadata of your local SP. Profile can be defined
separately for XML Signatures using property securityProfile and for SSL/TLS Signatures using
propertysslSecurityProfile. Value of both properties can be either metaiop or pkix. For details about
using Extended Metadata see Chapter 7, Metadata configuration, for reference of allowed values see
Section 7.3, “Extended metadata”.
With MetaIOP mode certificates are not checked for expiration or revocation and certificate paths are
not verified. This means that it does not matter which certification authority issued the certificate, as
the fact whether the certificate is trusted or not is conveyed using other mechanisms (e.g. by secure
metadata exchange or digital signature of metadata itself).
Signature is deemed trusted when the certificate used to create it is included in one of the following
places:
• Key with usage of signing or unspecified in entity metadata of a remote entity
• Signing key specified in property signingKey of extended metadata of a remote entity
MetaIOP is the default profile for verification of XML signatures. For details about this profile see the
specification.
PKIX profile
With PKIX profile trust of signature certificates is verified based on a certificate path between trusted
CA certificates and the certificate in question. Certificate is trusted when it's possible to construct path
from a trusted certificate to the validated one. With this profile certificate expiration and revocation can
be checked.
Trusted keys (anchors) for PKIX verification of signatures are combined from the following places:
• Key with usage of signing or unspecified in entity metadata of a remote entity
• Signing key specified in property signingKey of extended metadata of a remote entity
• All keys specified in trustedKeys set of extended metadata of a remote entity, or all keys available in
the key store when the property is null (default value)
Please note that trust anchors are treated as automatically trusted and are not necessarily subject to
all checks as leaf certificates are (depending on your security provider implementation). You should
preferably use only your CA and intermediary CA certificates as trust anchors. In case you want
to ignore certificates available in your XML metadata and only use settings from your manually set
ExtendedMetadata, set property useXmlMetadata of your metadataResolver to false:
PKIX verification supports checking of CRLs (certificate revocation lists) using the default underlaying
Java Security Provider (e.g. Sun JCE, BouncyCastle JCE).
The PKIX algorithm needs to be advised that the revocation checking is enabled. You can do so
by customizing the pkixTrustEvaluator inside SAMLContextProvider, see an example with properties
forceRevocationEnabled and revocationEnabled bellow.
By default the validation algorithm only uses the CertPathBuilder. Some Java security implementations
do not support full feature set of revocation checking in this class and only implement them in the
CertPathValidator (e.g. Sun provider only supports OCSP in CertPathBuilder since Java 1.8). You can
instruct system to use both CertPathBuilder and CertPathValidator by setting property validateCertPath
to true on bean CertPathPKIXTrustEvaluator.
The security provider used for loading of PKIX verification factories can be customized using property
securityProvider.
Spring SAML uses standard CertPath verification API. The default Sun JCE provider supports
automatic revocation checking based on the certificate's CRL Distribution Points Extension (by setting
system property com.sun.security.enableCRLDP to true), CRL point defined using certificate's Authority
Information Access (AIA) Extension (by setting system property com.sun.security.enableAIAcaIssuers
to true) and OCSP (by setting system property ocsp.enable to true). For details see the Java PKI
Programmer's Guide. In case you are using another security provider, please consult its manual for
functionality related to CertPathBuilder and CertPathValidator with the PKIX algorithm.
Custom profile
Engine used to verify trust of signatures for given combination of SP/IDP
is created in methods populateTrustEngine and populateSSLTrustEngine of interface
org.springframework.security.saml.context.SAMLContextProvider and can be overridden with custom
implementation. See Section 10.2, “Context provider” for details on context customization.
All supported values can be found in the ExtendedMetadata reference Section 7.3, “Extended
metadata”.
IDP discovery modes can always be skipped during SSO initialization by specifying HTTP request
parameter idp with the entityId of the required IDP, e.g. scheme://server:port/contextPath/saml/login?
idp=mySelectedIDP.
The URL where local SP expects discovery response can be included in the SP metadata as one of the
extensions. The feature can be enabled by setting property includeDiscoveryExtension to true on bean
MetadataGenerator inside MetadataGeneratorFilter, e.g.:
<bean id="metadataGeneratorFilter"
class="org.springframework.security.saml.metadata.MetadataGeneratorFilter">
<constructor-arg>
<bean class="org.springframework.security.saml.metadata.MetadataGenerator">
<property name="includeDiscoveryExtension" value="true"/>
</bean>
</constructor-arg>
</bean>
The default IDP can be configured using property defaultIDP on bean metadata in the Spring Security
configuration. In case the property isn't set, system will automatically use the first available IDP.
The selection page can be customized using property idpSelectionPath on bean samlIDPDiscovery.
System forwards to this page wih a discovery request which includes the following request attributes:
• idpDiscoReturnURL - URL to send the IDP selection result to using GET action
• idpDiscoReturnParam - name of the GET parameter to include the entity ID of the selected IDP
true. The remote discovery service needs to support the Identity Provider Discovery Service Protocol
and Profile.
After identification of IDP to use for authentication (for details see Section 9.1, “IDP selection and
discovery”), SAML Extension creates an AuthnRequest SAML message and sends it to the selected
IDP. Both construction of the AuthnRequest and binding used to send it can be customized using
WebSSOProfileOptions object. SAMLEntryPoint determines WebSSOProfileOptions configuration to
use by calling method getProfileOptions. The default implementation returns the value specified in
property defaultOptions. The method can be overridden to provide custom logic for SSO initialization.
Property Description
providerName Default: empty. Human readable name of the local SP sent with the
authentication request.
assertionConsumerIndex Default: empty. When set determines where should IDP send
response and which binding to use. Otherwise system uses the default
assertion consumer service marked as default, or first applicable.
Available indexes can be found in metadata of this service provider.
Property Description
passive Default: false. Sets whether the IdP should refrain from interacting with
the user during the authentication process.
forceAuthn Default: false. When true IDP is required to re-authenticate user and
not rely on previous authentication events.
includeScoping Default: true. When true request will include Scoping element.
relayState Default: empty. Value is sent to IDP and provided back to SP as part of
the authentication response.
The AuthnRequest message is sent unencrypted on message level. If needed, encryption should be
provided by SSL/TLS on transport layer.
Spring SAML supports reception of Unsolicited Response messages (so called IDP-initialized SSO). In
this scenario IDP creates a Response object in the same way as if it was replying to an AuthnRequest
message sent from SP, but it omits the InResponseTo parameter. Message is then sent to the
AssertionConsumerURL of Spring SAML (typically scheme://server:port/contextPath/saml/SSO) using
one of the supported bindings. List of all available endpoints and bindings can be found in the metadata
of the Spring SAML application.
Received Unsolicited Respose message is processed and validated in exactly the same way as with
SP-Initialized SSO.
Support for unsolicited messages can be disabled in the ExtendedMetadata of remote entities using
property supportUnsolicitedResponse.
Local logout
Local logout terminates only the local session and doesn't affect neither session at IDP, nor sessions
at other SPs where user logged in using single sign-on. Local logout can be initialized at scheme://
server:port/contextPath/saml/logout?local=true. Call is intercepted by bean samlLogoutFilter which can
be configured with the following settings:
It is also possible to configure local logout using standard Spring Security element <security:logout>
inside <security:http> block. For example:
<security:http>
<security:logout logout-url="/j_logout" logout-success-url="/logout.jsp"/>
</security:http>
Global logout
Global logout implements the SAML 2.0 Single Logout profile which terminates both session at the
current SP, the IDP session and sessions at other SPs connected to the same IDP session. Single
Logout can be initialized from any of the participating SPs or from the IDP.
Single Logout is currently supported with HTTP-Redirect and HTTP-POST bindings. SOAP binding is
not available.
Spring SAML correctly handles SAML 2.0 LogoutRequest messages sent from the IDP and performs
logout in case the message is valid. In case of invalid data (missing signature, invalid issuer, invalid issue
time, invalid destination, invalid session index, invalid name ID, no user logged in) system responds
with SAML 2.0 LogoutResponse with an error Status code.
The Authentication object will by default include string version of the NameID included in the SAML
Assertion as itsprincipal. Property forcePrincipalAsString can be used to change this to include the raw
NameID element.
The Authentication object is available in pages secured with Spring Security using
SecurityContextHolder.getContext().getAuthentication() and is populated with the following values:
Property Value
Credentials SAML authentication object including entity ID of local and remote entity, name ID,
assertion and relay state (org.springframework.security.saml.SAMLCredential)
package fi.schafer.test.saml;
import org.opensaml.saml2.core.Attribute;
import org.opensaml.xml.XMLObject;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.saml.SAMLCredential;
import org.springframework.security.saml.userdetails.SAMLUserDetailsService;
Population of the authentication object can be further customized by overriding of the getUserDetails,
getPrincipal, getEntitlements and getExpirationDate methods in the SAMLAuthenticationProvider.
XMLHelper.nodeToString(SAMLUtil.marshallMessage(credential.getAuthenticationAssertion()))
• org.springframework.security.saml.log.SAMLEmptyLogger
• org.springframework.security.saml.log.SAMLDefaultLogger
The logger is only called for messages which can be correctly received and parsed. For errors which
occur before correct parsing see Section 6.5, “Error handling”.
• Make sure that your reverse-proxy or load-balancer is configured to use sticky sessions. Information
about e.g. sent requests is stored within a user's HTTP session and sending of response to another
back-end node would make the original request data unavailable and fail the validation. Sticky session
are not necessary in case only IDP-initialized SSO is used or when sessions are replicated to all
nodes.
This setting enables the extension to correctly form all generated URLs and verify endpoints of the
incoming SAML messages.
• In case you use automatically generated metadata make sure to configure entityBaseURL matching
the front-end URL in your metadataGeneratorFilter bean:
<bean id="metadataGeneratorFilter"
class="org.springframework.security.saml.metadata.MetadataGeneratorFilter">
<constructor-arg>
<bean class="org.springframework.security.saml.metadata.MetadataGenerator">
<property name="entityBaseURL"
value="https://www.myserver.com/spring-security-saml2-sample"/>
</bean>
</constructor-arg>
</bean>
• Locate entityId of the local SP by parsing part of the URL after /alias/ (e.g. myAlias in
https://www.myserver.com/saml_extension/saml/sso/alias/myAlias?idp=myIdp) and matching it with
property alias specified in the ExtendedMetadata. In case the URL doesn't contain any alias part the
default service provider configured with property hostedSPName on the metadata bean is used.
• Populate credential used to decrypt data sent to this service provider. In case ExtendedMetadata
specifies property encryptionKey it will be used as an alias to lookup a private key from the
keyManager bean. Otherwise defaultKey of the keyManager bean will be used.
• Populate credential used for SSL/TLS client authentication. In case ExtendedMetadata specifies
property tlsKey it will be used as an alias to lookup key from keyManager bean. Otherwise no
credential will be provided for client authentication.
• Populate trust engine for verification of signatures. Depending on securityProfile setting in the
ExtendedMetadata trust engine based on either the section called “Metadata interoperability profile
(MetaIOP)” or the section called “PKIX profile” is created.
• Populate trust engine for verification of SSL/TLS connections. Depending on sslSecurityProfile setting
in the ExtendedMetadata trust engine based on either the section called “Metadata interoperability
profile (MetaIOP)” or the section called “PKIX profile” is created.
During initialization of SSO ContextProvider is also requested to provide metadata of the peer IDP.
System performs these steps to locate peer IDP to use:
• Load parameter idp of the HttpRequest object and try to locate peer IDP by the entityId. When
there's no idp parameter provided system will either start IDP discovery process (when enabled in
the ExtendedMetadata of the local SP) or use the default IDP specified in the metadata bean.
Validity of assertions processed during the signle sign-on process is limited to 3000 seconds. Value can
be customized with property maxAssertionTime of the WebSSOProfileConsumerImpl bean.
System allows users to single sign-on for up to 7200 seconds since their initial authentication with the
IDP (based on value AuthInstance of the Authentication statement). Some IDPs allow users to stay
authenticated for longer periods than this and you might need to change the default value by setting
maxAuthenticationAge of the WebSSOProfileConsumerImpl bean.
As clocks between IDP and SP machines may not be perfectly synchronized a tolerance of 60 seconds
is applied for time comparisons. The tolerance value (time skew) can be customized by settings property
responseSkew in beans WebSSOProfileConsumerImpl and SingleLogoutProfileImpl.
The following tables summarize all checks for time validity during processing of incoming SAML
messages. Response skew refers to property responseSkew set on profile beans. Past indicates that
validity window for checking of the value will be extended by responseSkew seconds to the past and
correspondingly with the future value. Nullable values can be missing from the incoming messages.
Table 10.1. Time checks during processing of incoming SAML Response in WebSSO and WebSSO
HoK profiles
response.issueInstant
Nullable: No
response.assertion.issueInstant
Nullable: No
response.assertion.subject.subjectConfirmation.notOnOrAfter
Nullable: No
response.assertion.authnStatement.authnInstant
Nullable: No
response.assertion.authnStatement.sessionNotOnOfAfter
Nullable: Yes
response.assertion.condition.notBefore
Nullable: Yes
response.assertion.condition.notOnOrAfter
Nullable: Yes
Table 10.2. Time checks during processing of incoming SAML LogoutRequest in Single Logout profile
response.issueInstant
Nullable: No
Table 10.3. Time checks during processing of incoming SAML LogoutResponse in Single Logout profile
response.issueInstant
Nullable: No
Table 10.4. Time checks during processing of incoming SAML ArtifactResponse in Artifact Resolution
profile
response.issueInstant
Nullable: No
ECP can be enabled in combination with the automatic metadata generation using the following settings:
<bean class="org.springframework.security.saml.metadata.MetadataGenerator">
<property name="extendedMetadata">
<bean class="org.springframework.security.saml.metadata.ExtendedMetadata">
<property name="ecpEnabled" value="true"/>
</bean>
</property>
</bean>
Another common use-case is situation when artifact resolution endpoint at IDP is secured using HTTP-
Basic authentication. Authentication can be configured by setting HTTPClient's property state with the
following bean:
After authentication at IDP, sample application displays information about the received and validated
assertion, or displays errors encountered during validation.
Clicking buttons "Global Logout" and "Local Logout" initializes the logout process as described in
Section 9.3, “Logout process”.
Administration part is secured with role ROLE_ADMIN and uses local authentication with default
username admin and password admin. As Spring Security allows only one authentication to be currently
active, authenticating to administration UI will remove any previous SAML authentication from the
security context.
• Displaying of existing identity provider and service provider entities by clicking on their identifier.
Information includes content of the metadata and extended metadata for the entity.
Options available in the interface are discussed in the section called “Automatic metadata generation”
and Section 7.3, “Extended metadata”. The generated values can be used as input for pre-configured
metadata described in the section called “Pre-configured metadata”.
<bean class="org.springframework.security.saml.metadata.ExtendedMetadataDelegate">
<constructor-arg>
<bean class="org.opensaml.saml2.metadata.provider.ResourceBackedMetadataProvider">
<constructor-arg>
<bean class="java.util.Timer"/>
</constructor-arg>
<constructor-arg>
<bean class="org.opensaml.util.resource.ClasspathResource">
<constructor-arg value="/metadata/FederationMetadata.xml"/>
</bean>
</constructor-arg>
<property name="parserPool" ref="parserPool"/>
</bean>
</constructor-arg>
<constructor-arg>
<bean class="org.springframework.security.saml.metadata.ExtendedMetadata"/>
</constructor-arg>
<property name="metadataTrustCheck" value="false"/>
</bean>
Initialize SP metadata
• Store content of the Metadata field to a document metadata.xml and upload it to the AD FS server
• In AD FS 2.0 Management Console select "Add Relying Party Trust"
• Select "Import data about the relying party from a file" and select the metadata.xml file created earlier.
Select Next
• The wizard may complain that some content of metadata is not supported. You can safely ignore
this warning
• Continue with the wizard. On the "Ready to Add Trust" make sure that tab endpoints contains multiple
endpoint values. If not, verify that your metadata was generated with HTTPS protocol URLs
• Leave "Open the Edit Claim Rules dialog" checkbox checked and finish the wizard
• Select "Add Rule", choose "Send LDAP Attributes as Claims" and press Next
• Add NameID as "Claim rule name", choose "Active Directory" as Attribute store, choose "SAM-
Account-Name" as LDAP Attribute and "Name ID" as "Outgoing claim type", finish the wizard and
confirm the claim rules window, in ADFS 3.0 you might need to configure the Name ID as a Pass
Through claim
• Open the provider by double-clicking it, select tab Advanced and change "Secure hash algorithm"
to SHA-1
Test SSO
12.2 Okta
Okta supports single sign-on to customer specified SAML 2.0 Service Provider applications, such
as Spring SAML Extension. Before starting with the configuration make sure that the following pre-
requisites are satisfied:
• Have an Okta instance and administration account ready, Okta license must allow you to add custom
applications
• Install a Java container (e.g. Tomcat) for deployment of the SAML 2 Extension
Information such as entity ID and URLs of your Spring SAML can be customized, see Section 7.1,
“Service provider metadata” for details.
Configure Okta
• Login to Okta as an administrator, select Admin, select Applications and click Create New App
• From the list of supported protocols select SAML 2.0 and press Create
• Define app name (e.g. Spring SAML), optionally define app image and press Next
• Configure SAML with the following settings:
Table 12.1.
Single Sign on URL Use value noted during Spring SAML initialization, e.g. http://
localhost:8080/spring-security-saml2-sample/saml/SSO
Audience URI (SP Entity ID) Use value noted during Spring SAML initialization, e.g. http://
localhost:8080/spring-security-saml2-sample/saml/metadata
Default RelayState Leave empty, unless you require Okta to provide a value to
Spring SAML
• In Okta click link "Identity provider metadata" and store the downloaded content to sample/src/main/
resources/metadata/okta.xml
• In Spring SAML modify bean metadata in sample/src/main/webapp/WEB-INF/securityContext.xml
and replace classpath:security/idp.xml with classpath:security/okta.xml:
<bean class="org.springframework.security.saml.metadata.ExtendedMetadataDelegate">
<constructor-arg>
<bean class="org.opensaml.saml2.metadata.provider.ResourceBackedMetadataProvider">
<constructor-arg>
<bean class="java.util.Timer"/>
</constructor-arg>
<constructor-arg>
<bean class="org.opensaml.util.resource.ClasspathResource">
<constructor-arg value="/metadata/okta.xml"/>
</bean>
</constructor-arg>
<property name="parserPool" ref="parserPool"/>
</bean>
</constructor-arg>
<constructor-arg>
<bean class="org.springframework.security.saml.metadata.ExtendedMetadata"/>
</constructor-arg>
</bean>
Test SSO
The checking of the InResponseToField can be disabled by re-configuring the context provider as
follows: