Since CAS 4.0.0, the SAML support is no longer available in the CAS server itself but through the cas-server-support-saml module : SAML Support in CAS 4
Since SAML 1.1 is well-documented elsewhere, this document deals with CAS-specific concerns.
Requesting SAML
A SAML 1.1 ticket validation response is obtained by validating a ticket via POST at the /samlValidate
URI. An example request/response follows for a successful ticket validation attempt.
POST /cas/samlValidate?ticket= Host: cas.example.com Content-Length: 491 Content-Type: text/xml <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Header/> <SOAP-ENV:Body> <samlp:Request xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" MajorVersion="1" MinorVersion="1" RequestID="_192.168.16.51.1024506224022" IssueInstant="2002-06-19T17:03:44.022Z"> <samlp:AssertionArtifact> ST-1-u4hrm3td92cLxpCvrjylcas.example.com </samlp:AssertionArtifact> </samlp:Request> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Header /> <SOAP-ENV:Body> <Response xmlns="urn:oasis:names:tc:SAML:1.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" IssueInstant="2008-12-10T14:12:14.817Z" MajorVersion="1" MinorVersion="1" Recipient="https://eiger.iad.vt.edu/dat/home.do" ResponseID="_5c94b5431c540365e5a70b2874b75996"> <Status> <StatusCode Value="samlp:Success"> </StatusCode> </Status> <Assertion xmlns="urn:oasis:names:tc:SAML:1.0:assertion" AssertionID="_e5c23ff7a3889e12fa01802a47331653" IssueInstant="2008-12-10T14:12:14.817Z" Issuer="localhost" MajorVersion="1" MinorVersion="1"> <Conditions NotBefore="2008-12-10T14:12:14.817Z" NotOnOrAfter="2008-12-10T14:12:44.817Z"> <AudienceRestrictionCondition> <Audience> https://some-service.example.com/app/ </Audience> </AudienceRestrictionCondition> </Conditions> <AttributeStatement> <Subject> <NameIdentifier>johnq</NameIdentifier> <SubjectConfirmation> <ConfirmationMethod> urn:oasis:names:tc:SAML:1.0:cm:artifact </ConfirmationMethod> </SubjectConfirmation> </Subject> <Attribute AttributeName="uid" AttributeNamespace="http://www.ja-sig.org/products/cas/"> <AttributeValue>12345</AttributeValue> </Attribute> <Attribute AttributeName="groupMembership" AttributeNamespace="http://www.ja-sig.org/products/cas/"> <AttributeValue> uugid=middleware.staff,ou=Groups,dc=vt,dc=edu </AttributeValue> </Attribute> <Attribute AttributeName="eduPersonAffiliation" AttributeNamespace="http://www.ja-sig.org/products/cas/"> <AttributeValue>staff</AttributeValue> </Attribute> <Attribute AttributeName="accountState" AttributeNamespace="http://www.ja-sig.org/products/cas/"> <AttributeValue>ACTIVE</AttributeValue> </Attribute> </AttributeStatement> <AuthenticationStatement AuthenticationInstant="2008-12-10T14:12:14.741Z" AuthenticationMethod="urn:oasis:names:tc:SAML:1.0:am:password"> <Subject> <NameIdentifier>johnq</NameIdentifier> <SubjectConfirmation> <ConfirmationMethod> urn:oasis:names:tc:SAML:1.0:cm:artifact </ConfirmationMethod> </SubjectConfirmation> </Subject> </AuthenticationStatement> </Assertion> </Response> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Client Support
The SAML 1.1 protocol is supported in the following clients as of this writing:
- Jasig Java CAS Client 3.1.x, see Saml11TicketValidationFilter Example.
- phpCAS 1.1.0, see phpCAS examples#phpCASexamples-SAMLProtocolwithAttributeRelease.
- mod_auth_cas 1.0.9
- .Net Cas Client
Customizing the SAML artifact used
In different versions of CAS, we've swapped the artifact type created by the SamlCompliantUniqueTicketIdGenerator. Unfortunately, not often for the better! As of CAS 3.4, the generator can handle both.
When constructing an instance of the SamlCompliantUniqueTicketIdGenerator, you may set the "saml2compliant" property to "true" in order to generate SAML2 artifacts. Otherwise SAML1 compliant artifacts are generated.
The example Spring configuration would look like the following (overriding the WEB-INF/spring-configuration/uniqueIdGenerators.xml):
<bean id="samlServiceTicketUniqueIdGenerator" class="org.jasig.cas.util.SamlCompliantUniqueTicketIdGenerator"> <constructor-arg index="0" value="https://localhost:8443" /> <property name="saml2compliant" value="true" /> </bean>