Skip to content

Enterprise SSO setup guides

Enterprise SSO setup guides

When a customer connects their own identity provider, the hard part is not the protocol. It is the administrator on their IdP's admin screen, holding your ACS URL and entity ID, looking for fields called something else. Cbox\Id\Federation\IdentityProviderGuides holds that mapping for twenty identity providers: which of your values goes into which of their fields, by the label their screen prints, what they hand back, the steps in their own vocabulary, and a link to the vendor's documentation.

These guides are for the inbound direction — the customer's IdP signing its people in to you over SAML 2.0 or OpenID Connect, and pushing them to you over SCIM. Providers people sign in with (Google, GitHub, LinkedIn…) are the sign-in provider catalogue, which is what sign-in buttons are built from. The two lists are kept apart so that an enterprise IdP never becomes a button.

The guides

Key Identity provider Protocol SCIM push
okta Okta SAML Yes
entra Microsoft Entra ID SAML Yes
google Google Workspace SAML No
onelogin OneLogin SAML Yes (SCIM Provisioner with SAML connector)
jumpcloud JumpCloud SAML Yes
pingfederate PingFederate SAML Yes (SCIM Provisioner add-on)
pingone PingOne SAML Yes
adfs AD FS SAML No
auth0 Auth0 SAML No
keycloak Keycloak OIDC No
duo Duo SAML Yes
cyberark CyberArk Identity SAML Yes
shibboleth Shibboleth IdP SAML No
oracle Oracle Cloud Infrastructure IAM SAML Yes
sap SAP Cloud Identity Services SAML No
salesforce Salesforce SAML No
lastpass LastPass SAML No
cloudflare Cloudflare Access SAML No
saml Any SAML 2.0 IdP SAML —
oidc Any OpenID Connect provider OIDC —

"SCIM push" means the IdP can provision a custom application over SCIM 2.0 using a bearer token. An IdP that only provisions a fixed list of catalogued apps (Google), that is itself a SCIM server rather than a client (Keycloak), or whose SCIM target accepts only Basic or client-credentials authentication (SAP) has no directory guide. For any other SCIM 2.0 client, IdentityProviderGuides::genericDirectory() describes the two values every client needs.

Rendering a guide

Fill a ServiceProviderValues with the connection's values, then let each field pick the one it asks for:

use Cbox\Id\Federation\IdentityProviderGuides;
use Cbox\Id\Federation\ValueObjects\ServiceProviderValues;

$guide = IdentityProviderGuides::find('onelogin');

$values = new ServiceProviderValues(
    acsUrl: url("/sso/saml/{$connection->id}/acs"),
    entityId: $spEntityId,
    sloUrl: url("/sso/saml/{$connection->id}/slo"),
    spMetadataUrl: url("/sso/saml/{$connection->id}/metadata"),
    loginUrl: url("/sso/saml/{$connection->id}/login"),
);

foreach ($guide->fields as $field) {
    // $field->theirs   "ACS (Consumer) URL Validator" — never translate this
    // $field->location where on their screen, when the label alone is ambiguous
    // $field->optional true for e.g. a Single Logout URL
    $value = $field->valueFrom($values);
}

$guide->returns->kind;   // GuideReturnKind::Url — "Issuer URL"
$guide->setupSteps;      // English steps
$guide->documentationUrl;

Two values are derived for you: SpValue::AcsUrlPattern (the anchored, escaped regex OneLogin's validator wants) from the ACS URL, and SpValue::ScimHost / SpValue::ScimBasePath (Oracle asks for host and path separately) from the SCIM base URL. SpValue::ScimToken->isSecret() tells a console which value to show once and mask.

returns->kind decides the next form: Url (a SAML metadata URL to fetch), Xml (a file to upload), UrlOrXml (prefer the URL — it lets you pick up their certificate rotation), or Oidc (issuer, client ID and client secret).

Lists

IdentityProviderGuides::all();                         // every guide, console order
IdentityProviderGuides::forProtocol(GuideProtocol::Saml);
IdentityProviderGuides::directories();                 // guides with a SCIM directory guide
IdentityProviderGuides::genericDirectory();
ProviderCatalog::enterpriseGuides();                   // the same list, from the catalogue

Translating the console

Field labels (theirs, location, returns->theirs) are what the administrator looks for on the IdP's screen, so they stay exactly as the vendor prints them in every language. The steps are English. A host that translates its console keeps its own translated step text keyed by the guide key, and reads everything else from here.

How the labels were sourced

Every label was read on the vendor's own documentation, and documentationUrl is the page that was read. A label that could not be confirmed there was left out rather than guessed. Admin consoles change; if a label has moved, the vendor link on the guide is the first place to check.