Adding Enhanced Client or Proxy (ECP) Profile support to the IdP

This document describes the necessary steps to enable support for the SAML V2.0 Enhanced Client or Proxy Profile Version 2.0 on a simpleSAMLphp Identity Provider (IdP).

The SAML V2.0 Enhanced Client or Proxy (ECP) profile is a SSO profile for use with HTTP, and clients with the capability to directly contact a principal's identity provider(s) without requiring discovery and redirection by the service provider, as in the case of a browser. It is particularly useful for desktop or server-side HTTP clients.

Limitations

This feature has been tested to work with Microsoft Office 365, but other service providers may require features of the ECP profile that are currently unsupported!

Enabling ECP Profile on the IdP

To enable the IdP to send ECP assertions you must add the saml20.ecp option to the saml20-idp-hosted metadata file:

$metadata['__DYNAMIC:1__'] = [
    [....]
    'auth' => 'example-userpass',
    'saml20.ecp' => true,
];

Note: authentication filters that require interaction with the user will not work with ECP.

Add new metadata to SPs

After enabling the ECP Profile your IdP metadata will change. An additional ECP SingleSignOnService endpoint is added. You therefore need to update the metadata for your IdP at your SPs. The saml20-idp-remote metadata for simpleSAMLphp SPs should contain something like the following code:

'SingleSignOnService' => [
    0 => [
        'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
        'Location' => 'https://idp.example.org/simplesaml/saml2/idp/SSOService.php',
    ],
    1 => [
        'index' => 0,
        'Location' => 'https://didp.example.org/simplesaml/saml2/idp/SSOService.php',
        'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:SOAP',
    ],
],

SP metadata on the IdP

A SP using the ECP Profile must have an AssertionConsumerService endpoint supporting that profile. This means that you have to use the complex endpoint format in saml20-sp-remote metadata. In general, this should look like the following code:

'AssertionConsumerService' => [
    0 => [
        'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
        'Location' => 'https://sp.example.org/Shibboleth.sso/SAML2/POST',
        'index' => 1,
    ],
    1 => [
        'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:PAOS',
        'Location' => 'https://sp.example.org/ECP',
        'index' => 2,
    ],
],