SAML2 Services

SAML relying parties and services must be registered within the CAS service registry similar to the following example:

1
2
3
4
5
6
7
8
{
  "@class" : "org.apereo.cas.support.saml.services.SamlRegisteredService",
  "serviceId" : "the-entity-id-of-the-sp",
  "name" : "SAMLService",
  "id" : 10000003,
  "evaluationOrder" : 10,
  "metadataLocation" : "https://url/to/metadata.xml"
}
:information_source: Entity ID Patterns

The serviceId field here should represent the entity id of the SAML2 service provider in form of a proper regular expression, allowing you to authorize and register multiple SAML2 service providers in your metadata file, if necessary. Remember to escape all the right characters when you build the expression pattern.

The following fields are available for SAML services:

Field Description
metadataLocation Location of service metadata defined from system files, classpath, directories or URL resources.
idpMetadataLocation Directory location of identity provider metadata available to CAS as an override.
metadataProxyLocation Proxy endpoint (https://proxy-address:8901) to fetch service metadata from URL resources.
metadataSignatureLocation Location of the metadata signing certificate/public key to validate the metadata which must be defined from system files or classpath. If defined, will enforce the SignatureValidationFilter validation filter on metadata.
metadataExpirationDuration If defined, will expire metadata in the cache after the indicated duration which will force CAS to
retrieve and resolve the metadata again. Default is 60 minutes.
requireSignedRoot Whether the metadata root element is required to be signed. Default is true.
signUnsolicitedAuthnRequest When dealing with Unsolicited SSO, determine whether the authentication request should be forcefully signed.
signAssertions Whether assertions should be signed. Default is FALSE. Accepted values are TRUE, FALSE, UNDEFINED. When set to UNDEFINED, CAS will respect the WantAssertionsSigned flag in the SAML service provider metadata.
signResponses Whether responses should be signed. Default is true.
encryptionOptional Encrypt whenever possible (i.e a compatible key is found in the peer’s metadata) or skip encryption otherwise. Default is false.
encryptAssertions Whether assertions should be encrypted. Default is false.
encryptAttributes Whether assertion attributes should be encrypted. Default is false.
encryptableAttributes Set of attributes nominated for encryption, disqualifying others absent in this collection. Default (i.e. *) is to encrypt all once encryptAttributes is true.
requiredAuthenticationContextClass If defined, will specify the SAML authentication context class in the final response. If undefined, the authentication class will either be urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified or urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport depending on the SAML authentication request. The value may be specified as a path to an external Groovy script.
requiredNameIdFormat If defined, will force the indicated Name ID format in the final SAML response.
skewAllowance If defined, indicates number of seconds used to skew authentication dates such as valid-from and valid-until elements, etc.
metadataCriteriaPattern If defined, will force an entity id filter on the metadata aggregate based on the PredicateFilter to include/exclude specific entity ids based on a valid regex pattern.
metadataCriteriaDirection If defined, will force the PredicateFilter to either include or remove entities from the resolved metadata. Allowed values are INCLUDE,EXCLUDE.
metadataCriteriaRoles If defined, will allow the defined metadata roles (i.e. SPSSODescriptor, IDPSSODescriptor). Default is SPSSODescriptor.
metadataCriteriaRemoveEmptyEntitiesDescriptors Controls whether to keep entities descriptors that contain no entity descriptors. Default is true.
metadataCriteriaRemoveRolelessEntityDescriptors Controls whether to keep entity descriptors that contain no roles. Default is true.
attributeNameFormats Map that defines attribute name formats for a given attribute name to be encoded in the SAML response.
attributeFriendlyNames Map that defines attribute friendly names for a given attribute name to be encoded in the SAML response.
attributeValueTypes Map that defines the type of attribute values for a given attribute name.
nameIdQualifier If defined, will overwrite the NameQualifier attribute of the produced subject’s name id. Use none to skip.
logoutResponseBinding If defined, will overwrite the binding used to prepare logout responses for the service provider.
logoutResponseEnabled Control whether SAML2 logout responses should be generated and sent for this SAML2 service provider.
signLogoutResponse Control whether SAML2 logout responses should be signed.
issuerEntityId If defined, will override the issue value with the given identity provider entity id. This may be useful in cases where CAS needs to maintain multiple identity provider entity ids.
assertionAudiences Comma-separated list of audience urls to include in the assertion. Will override the entity id.
subjectLocality If defined, will overwrite the SubjectLocality attribute of the SAML2 authentication statement.
serviceProviderNameIdQualifier If defined, will overwrite the SPNameQualifier attribute of the produced subject’s name id. Use none to skip.
skipValidatingAuthnRequest Skip validating the SAML2 authentication request and its signature in particular. Default is false.
skipGeneratingAssertionNameId Whether generation of a name identifier should be skipped for assertions. Default is false.
skipGeneratingTransientNameId Whether transient name identifier generation should be skipped. Default is false.
isSkipGeneratingResponseInResponseTo Whether generation of the InResponseTo element should be skipped for responses. Default is false.
skipGeneratingSubjectConfirmationInResponseTo Whether generation of the InResponseTo element should be skipped for subject confirmations. Default is false.
skipGeneratingSubjectConfirmationNotOnOrAfter Whether generation of the NotOnOrBefore element should be skipped for subject confirmations. Default is false.
skipGeneratingSubjectConfirmationAddress Whether generation of the Address element should be skipped for subject confirmations. Default is false.
skipGeneratingSubjectConfirmationRecipient Whether generation of the Recipient element should be skipped for subject confirmations. Default is false.
skipGeneratingSubjectConfirmationNotBefore Whether generation of the NotBefore element should be skipped for subject confirmations. Default is true.
skipGeneratingSubjectConfirmationNameId Whether generation of the NameID element should be skipped for subject confirmations. Default is true.
skipGeneratingServiceProviderNameIdQualifier Whether generation of the SPNameQualifier element should be skipped. Default is false.
skipGeneratingAuthenticatingAuthority Whether generation of the AuthenticatingAuthorities element should be skipped. Default is false.
skipGeneratingNameIdQualifier Whether generation of the NameIdQualifier element should be skipped. Default is false.
skipGeneratingSessionNotOnOrAfter Whether generation of the SessionNotOnOrAfter element should be skipped. Default is false.
signingCredentialFingerprint SHA-1 digest of the signing credential’s public key, parsed as a regular expression, used for the purposes of key rotation when dealing with multiple credentials.
signingCredentialType Acceptable values are BASIC and X509. This setting controls the type of the signature block produced in the final SAML response for this application. The latter, being the default, encodes the signature in PEM format inside a X509Data block while the former encodes the signature based on the resolved public key under a DEREncodedKeyValue block.
signingSignatureReferenceDigestMethods Collection of signing signature reference digest methods, if any, to override the global defaults.
signingKeyAlgorithm Signing key algorithm to forcibly use for signing operations when loading the private key. Default is RSA.
signingSignatureAlgorithms Collection of signing signature algorithms, if any, to override the global defaults.
signingSignatureBlackListedAlgorithms Collection of rejected signing signature algorithms, if any, to override the global defaults.
signingSignatureWhiteListedAlgorithms Collection of allowed signing signature algorithms, if any, to override the global defaults.
signingSignatureCanonicalizationAlgorithm The signing signature canonicalization algorithm, if any, to override the global defaults.
encryptionDataAlgorithms Collection of encryption data algorithms, if any, to override the global defaults.
encryptionKeyAlgorithms Collection of encryption key transport algorithms, if any, to override the global defaults.
encryptionBlackListedAlgorithms Collection of rejected encryption algorithms, if any, to override the global defaults.
encryptionWhiteListedAlgorithms Collection of allowed encryption algorithms, if any, to override the global defaults.
whiteListBlackListPrecedence Preference value indicating which should take precedence when both whitelist and blacklist are non-empty. Accepted values are INCLUDE or EXCLUDE. Default is INCLUDE.
:information_source: Keep What You Need!

You are encouraged to only keep and maintain properties and settings needed for a particular integration. It is UNNECESSARY to grab a copy of all service fields and try to configure them yet again based on their default. While you may wish to keep a copy as a reference, this strategy would ultimately lead to poor upgrades increasing chances of breaking changes and a messy deployment at that.

The following settings and properties are available from the CAS configuration catalog:

The configuration settings listed below are tagged as Optional in the CAS configuration metadata. This flag indicates that the presence of the setting is not immediately necessary in the end-user CAS configuration, because a default value is assigned or the activation of the feature is not conditionally controlled by the setting value. In other words, you should only include this field in your configuration if you need to modify the default value or if you need to turn on the feature controlled by the setting.

Configuration Metadata

The collection of configuration properties listed in this section are automatically generated from the CAS source and components that contain the actual field definitions, types, descriptions, modules, etc. This metadata may not always be 100% accurate, or could be lacking details and sufficient explanations.

Be Selective

This section is meant as a guide only. Do NOT copy/paste the entire collection of settings into your CAS configuration; rather pick only the properties that you need. Do NOT enable settings unless you are certain of their purpose and do NOT copy settings into your configuration only to keep them as reference. All these ideas lead to upgrade headaches, maintenance nightmares and premature aging.

YAGNI

Note that for nearly ALL use cases, declaring and configuring properties listed here is sufficient. You should NOT have to explicitly massage a CAS XML/Java/etc configuration file to design an authentication handler, create attribute release policies, etc. CAS at runtime will auto-configure all required changes for you. If you are unsure about the meaning of a given CAS setting, do NOT turn it on without hesitation. Review the codebase or better yet, ask questions to clarify the intended behavior.

Naming Convention

Property names can be specified in very relaxed terms. For instance cas.someProperty, cas.some-property, cas.some_property are all valid names. While all forms are accepted by CAS, there are certain components (in CAS and other frameworks used) whose activation at runtime is conditional on a property value, where this property is required to have been specified in CAS configuration using kebab case. This is both true for properties that are owned by CAS as well as those that might be presented to the system via an external library or framework such as Spring Boot, etc.

:information_source: Note

When possible, properties should be stored in lower-case kebab format, such as cas.property-name=value. The only possible exception to this rule is when naming actuator endpoints; The name of the actuator endpoints (i.e. ssoSessions) MUST remain in camelCase mode.

Settings and properties that are controlled by the CAS platform directly always begin with the prefix cas. All other settings are controlled and provided to CAS via other underlying frameworks and may have their own schemas and syntax. BE CAREFUL with the distinction. Unrecognized properties are rejected by CAS and/or frameworks upon which CAS depends. This means if you somehow misspell a property definition or fail to adhere to the dot-notation syntax and such, your setting is entirely refused by CAS and likely the feature it controls will never be activated in the way you intend.

Validation

Configuration properties are automatically validated on CAS startup to report issues with configuration binding, specially if defined CAS settings cannot be recognized or validated by the configuration schema. Additional validation processes are also handled via Configuration Metadata and property migrations applied automatically on startup by Spring Boot and family.

Indexed Settings

CAS settings able to accept multiple values are typically documented with an index, such as cas.some.setting[0]=value. The index [0] is meant to be incremented by the adopter to allow for distinct multiple configuration blocks.

Service Provider Integrations

A number of SAML2 service provider integrations are provided natively by CAS. To learn more, please review this guide.

Service Provider Metadata

SAML2 service provider metadata can be registered with and managed by CAS in several ways. To learn more, please review this guide.