Unsigned/unencrypted SAML v2.0 assertions
For examples of the federation configuration files, refer to Example SAML v2.0 Fedlet files. To set up multiple SPs, work through this page and SAML 2.0 and multiple applications.
-
Set up the network:
Add
sp.example.comto your/etc/hostsfile:127.0.0.1 localhost am.example.com ig.example.com app.example.com sp.example.comTraffic to the application is proxied through PingGateway, using the host name
sp.example.com. -
Configure a Java Fedlet:
The SAML library component validates the SP’s AssertionConsumerService Location against the incoming IdP SAML Assertion, based on the request information, including the port. In
sp.xml, always specify the port in the Location value ofAssertionConsumerService, even when using defaults of 443 or 80, as follows:<AssertionConsumerService isDefault="true" index="0" Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://sp.example.com:443/fedletapplication" />For more information about Java Fedlets, refer to Creating and configuring the Fedlet in AM’s SAML v2.0 guide.
-
Copy and unzip the fedlet zip file,
Fedlet-8.0.0.zip, delivered with the AM installation, into a local directory.$ unzip $HOME/openam/Fedlet-8.0.0.zipOutputArchive: Fedlet-8.0.0.zip creating: conf/ inflating: README inflating: conf/FederationConfig.properties inflating: conf/fedlet.cot-template inflating: conf/idp-extended.xml-template inflating: conf/sp-extended.xml-template inflating: conf/sp.xml-template inflating: fedlet.war -
In each file, search and replace the following properties:
Replace this With this IDP_ENTITY_IDopenamFEDLET_ENTITY_IDspFEDLET_PROTOCOL://FEDLET_HOST:FEDLET_PORT/FEDLET_DEPLOY_URIhttp://sp.example.com:8080/samlfedletcotandFEDLET_COTCircle of Trustsp.example.com:8080/saml/fedletapplicationsp.example.com:8080/saml/fedletapplication/metaAlias/sp -
Save the files as .xml, without the
-templateextension, so that the directory looks like this:conf ├── FederationConfig.properties ├── fedlet.cot ├── idp-extended.xml ├── sp-extended.xml └── sp.xml
By default, AM as an IdP uses the NameID format
urn:oasis:names:tc:SAML:2.0:nameid-format:transientto communicate about a user. For information about using a different NameID format, refer to Non-transient SAML v2.0 NameID format.
-
-
Set up AM:
-
In the AM admin UI, select Identities, select the user
demo, and change the last name toCh4ng31t. Note that, for this example, the last name must be the same as the password. -
Select Applications > Federation > Circles of Trust, and add a circle of trust called
Circle of Trust, with the default settings. -
Set up a remote service provider:
-
Select Applications > Federation > Entity Providers, and add a remote entity provider.
-
Drag in or import
sp.xmlcreated in the previous step. -
Select Circles of Trust:
Circle of Trust.
-
-
Set up a hosted identity provider:
-
Select Applications > Federation > Entity Providers, and add a hosted entity provider with the following values:
-
Entity ID:
openam -
Entity Provider Base URL:
http://am.example.com:8088/openam -
Identity Provider Meta Alias:
idp -
Circles of Trust:
Circle of Trust
-
-
Select Assertion Processing > Attribute Mapper, map the following SAML attribute keys and values, and then save your changes:
-
SAML Attribute:
cn, Local Attribute:cn -
SAML Attribute:
sn, Local Attribute:sn
-
-
In a terminal, export the XML-based metadata for the IdP:
$ curl -v \ --output idp.xml \ "http://am.example.com:8088/openam/saml2/jsp/exportmetadata.jsp?entityid=openam"The
idp.xmlfile is created locally.
-
-
-
Set up PingGateway:
-
Copy the edited fedlet files, and the exported
idp.xmlfile into the PingGateway configuration, at$HOME/.openig/SAML.$ ls -l $HOME/.openig/SAMLOutputFederationConfig.properties fedlet.cot idp-extended.xml idp.xml sp-extended.xml sp.xml
-
Don’t use a
baseURIsetting.Requests to the SamlFederationHandler must not be rebased because the request URI must match the endpoint in the SAML metadata.
-
Add the following route to PingGateway to serve the sample application .css and other static resources:
- Linux
-
$HOME/.openig/config/routes/00-static-resources.json - Windows
-
%appdata%\OpenIG\config\routes\00-static-resources.json
{ "name" : "00-static-resources", "baseURI" : "http://app.example.com:8081", "condition": "${find(request.uri.path,'^/css') or matchesWithRegex(request.uri.path, '^/.*\\\\.ico$') or matchesWithRegex(request.uri.path, '^/.*\\\\.gif$')}", "handler": "ReverseProxyHandler" }Source: 00-static-resources.json
-
Add the following route to PingGateway:
- Linux
-
$HOME/.openig/config/routes/saml-handler.json - Windows
-
%appdata%\OpenIG\config\routes\saml-handler.json
{ "name": "saml-handler", "condition": "${find(request.uri.path, '^/saml')}", "handler": { "type": "SamlFederationHandler", "config": { "useOriginalUri": true, "assertionMapping": { "username": "cn", "password": "sn" }, "subjectMapping": "sp-subject-name", "redirectURI": "/home/federate" } } }Source: saml-handler.json
Notice the following features of the route:
-
The route matches requests to
/saml. -
After authentication, the SamlFederationHandler extracts
cnandsnfrom the SAML assertion, and maps them to the SessionContext, atsession.usernameandsession.password. -
The handler stores the subject name as a string in the session field
session.sp-subject-name, which is named by thesubjectMappingproperty. By default, the subject name is stored in the session fieldsession.subjectName. -
The handler redirects the request to the
/federateroute.
-
Add the following route to PingGateway:
- Linux
-
$HOME/.openig/config/routes/federate-handler.json - Windows
-
%appdata%\OpenIG\config\routes\federate-handler.json
{ "name": "federate-handler", "condition": "${find(request.uri.path, '^/home/federate')}", "baseURI": "http://app.example.com:8081", "handler": { "type": "DispatchHandler", "config": { "bindings": [ { "condition": "${empty session.username}", "handler": { "type": "StaticResponseHandler", "config": { "status": 302, "headers": { "Location": [ "http://sp.example.com:8080/saml/SPInitiatedSSO?metaAlias=/sp" ] } } } }, { "handler": { "type": "Chain", "config": { "filters": [ { "type": "HeaderFilter", "config": { "messageType": "REQUEST", "add": { "x-username": ["${session.username[0]}"], "x-password": ["${session.password[0]}"] } } } ], "handler": "ReverseProxyHandler" } } } ] } } }Source: federate-handler.json
Notice the following features of the route:
-
The route matches requests to
/home/federate. -
If the user is not authenticated with AM, the username is not populated in the context. The DispatchHandler then dispatches the request to the StaticResponseHandler, which redirects it to the SP-initiated SSO endpoint.
If the credentials are in the context, or after successful authentication, the DispatchHandler dispatches the request to the Chain.
-
The HeaderFilter adds headers for the first value for the
usernameandpasswordattributes of the SAML assertion.
-
Restart PingGateway.
-
-
Test the setup:
-
Log out of AM, and test the setup with the following links:
-
Log in to AM with username
demoand passwordCh4ng31t.PingGateway returns the response page showing that the the demo user has logged in.
-
|
For more control over the URL where the user agent is redirected, use the
The In the following example, the user is finally redirected to the original URI from the request:
|