<div class="gfmr-markdown-container"><div class="gfmr-markdown-source" style="display: none;"># Okta Configuration using SAML
If using Okta via OIDC, [click here](../idp_okta_oidc).
## Save the current PDC keys in a PEM file
1. Visit the PDC Keycloak SAML configuration URL, similar to
`https://example.org/realms/pdc/protocol/saml/descriptor`
2. Within the XML document presented, copy and paste each PEM-encoded value
under "<md:KeyDescriptor use='signing'>…<ds:X509Certificate>", similar to
`MIIC…=`, into a single (new) text file.
3. Surround each of the values from above with PEM headers and footers, namely
`—–BEGIN CERTIFICATE—–` and `—–END CERTIFICATE—–`, each on their
own lines.
4. Line-wrap each of the values from above at 64 characters, according to
https://www.rfc-editor.org/rfc/rfc7468.html#page-5
5. Save the new file with a `.crt` extension, such as `pdc_signing_keys.crt`.
This file will be used below to configure signature validation. When using SAML
with Okta, there is no option to dynamically fetch these keys. So when PDC keys
are updated, the integration will not work until re-uploading the PDC keys. Thus
[OIDC is preferred](../idp_okta_oidc)) when
using Okta.
## Configure Okta App Integration
1. Log in to the admin area to Start a SAML App Integration (these steps follow
https://help.okta.com/en-us/content/topics/apps/apps_app_integration_wizard_saml.htm
)
2. On the left nav bar, visit "Applications" -> "Applications"
3. Click "Create App Integration"

4. Click "SAML 2.0"

5. Click "Next"
6. Set "App Name" to `Philanthropy Data Commons`
7. If you wish to add a logo, one may be found on the [PDC website](https://philanthropydatacommons.org/)
8. Check "Do not display application icon to users" under "App visibility" to
avoid erroneous IdP-initiated login attempts (because users begin the login
flow from PDC Apps and not from the Okta IdP)
9. Click "Next"
10. Paste the Single sign-on URL endpoint provided by the PDC team, similar to
`https://example.org/realms/pdc/broker/foundation-okta-saml/endpoint`
into Okta's "Single sign-on URL"
11. Paste the "SP Entity ID URL" provided by the PDC team, similar to
`https://example.org/realms/pdc` into Okta's "Audience URI (SP Entity ID)"
field
12. Set the "Name ID format" to `EmailAddress`
13. Set the "Application username" to `Email`
14. Expand "Show Advanced Settings"
15. Ensure both "Response" and "Assertion Signature" are `Signed`
16. Add a "Signature Certificate" PEM file by clicking "Browse files…",
created [above](#Save the current PDC keys in a PEM file)
17. Add Attribute Statements (case sensitive, use the dropdown for each Value):
– Map `firstName`, `Basic` to `user.firstName`
– Map `lastName`, `Basic` to `user.lastName`

18. Click "Next"
19. Click "Finish"
20. Send Okta's SAML "Metadata URL" value to the PDC team.

The PDC team will use this URL to configure an Identity Provider (IdP) within
PDC Keycloak and link it to a PDC Keycloak organization such that when users log
into PDC they will be redirected to their canonical IdP based on the domain name
in the email address. For example, entering "
[email protected]" should
redirect the user to Okta. [Okta
configuration](https://help.okta.com/en-us/content/topics/users-groups-profiles/usgp-assign-apps.htm)
will determine whether a myfoundation user can log into the PDC. If
"
[email protected]" has been assigned in Okta, then the Okta-configured
login procedure will be used for authentication, and if successful, the user
will be redirected to PDC Keycloak and be granted a valid PDC session.
# PDC Keycloak Configuration with Okta via SAML
Add a SAML Identity Provider to the PDC Realm.
See also this Keycloak documentation:
https://www.keycloak.org/docs/26.2.5/server_admin/index.html#_client-saml-configuration
1. Visit "Identity Providers"
2. Click "Add Identity Provider" of type "SAML v2.0." If none are present such
that "Add Identity Provider" is not available, click "SAML v2.0" under "User
defined"
3. Set the "Alias" to the descriptive, simple, unique alias named above, e.g.
`foundation-okta-saml`, **Important**: this alias sets the broker or
"Single Sign-on URL" used by Okta for integration and therefore must match
the "Single Sign-on URL" configured in Okta
4. Set the "SAML entity descriptor" to the URL sent from the person who
configured Okta. In Okta this is called the "Metadata URL"
5. Verify that the "NameID policy format" is `Email` (if not, contact the person
who configured Okta to correct the Okta configuration, refer to Okta's step 11)
6. Set the "Principal type" to `Subject NameID`
7. Set "Want AuthnRequests signed" to `On`
8. Set "Want Assertions signed" to `On`
9. Set "Validate Signatures" to `On`
10. Set "Sign service provider metadata" to `On`
11. Set "Pass subject" to `On`
12. Set "Hide on login page" to `On`
13. Set "Sync mode" to `Force`
14. Click "Save"
15. Click the "Mappers" tab on the Identity Provider
16. Add a map from `firstName` to `firstName`:
– Click "Add mapper"
– Set "Name" to `Import First Name`
– Leave "Sync mode override" as `Inherit`
– Select `Attribute Importer` from the "Mapper type" dropdown menu
– Set "Attribute Name" to `firstName` **Important:** this attribute name
must match a "Name" set in Okta "Attribute Statements (optional)" for the
import to work
– Leave "Name Format" as `ATTRIBUTE_FORMAT_BASIC`
– Select `firstName` from the "User Attribute Name" dropdown
– Click "Save"
17. Add a map from `lastName` to `lastName`:
– Click "Add mapper"
– Set "Name" to `Import Last Name`
– Leave "Sync mode override" as `Inherit`
– Select `Attribute Importer` from the "Mapper type" dropdown menu
– Set "Attribute Name" to `lastName` **Important:** this attribute name must
match a "Name" set in Okta "Attribute Statements (optional)" for the
import to work
– Leave "Name Format" as `ATTRIBUTE_FORMAT_BASIC`
– Select `lastName` from the "User Attribute Name" dropdown
– Click "Save".
Link the newly added IdP to its corresponding organization.
See also this Keycloak documentation:
https://www.keycloak.org/docs/26.2.5/server_admin/index.html#_managing_identity_provider_
1. Visit "Organizations"
2. Open the organization
3. Click the "Identity Providers" tab
4. Click "Link identity provider"
5. Select the IdP (created above) from the "Identity provider" dropdown menu
6. Select the organization's domain name from the "Domain" dropdown menu
7. Keep "Hide on login page" set to `On`
8. Set "Redirect when email domain matches" to `On`
9. Click "Save".
[Test the integration](../organization_idp_integration#to-test-an-integration)
</div><div class="gfmr-markdown-rendered" data-mermaid-bg-color="transparent" data-shiki-theme="github-dark"><h1>Okta Configuration using SAML</h1>
<p>If using Okta via OIDC, <a href="../idp_okta_oidc">click here</a>.</p>
<h2>Save the current PDC keys in a PEM file</h2>
<ol>
<li>Visit the PDC Keycloak SAML configuration URL, similar to<br>
<code>https://example.org/realms/pdc/protocol/saml/descriptor</code></li>
<li>Within the XML document presented, copy and paste each PEM-encoded value<br>
under “<md:KeyDescriptor use=‘signing’>…<a href="X509Certificate">ds:X509Certificate</a>”, similar to<br>
<code>MIIC...=</code>, into a single (new) text file.</li>
<li>Surround each of the values from above with PEM headers and footers, namely<br>
<code>-----BEGIN CERTIFICATE-----</code> and <code>-----END CERTIFICATE-----</code>, each on their<br>
own lines.</li>
<li>Line-wrap each of the values from above at 64 characters, according to<br>
<a href="https://www.rfc-editor.org/rfc/rfc7468.html#page-5">https://www.rfc-editor.org/rfc/rfc7468.html#page-5</a></li>
<li>Save the new file with a <code>.crt</code> extension, such as <code>pdc_signing_keys.crt</code>.</li>
</ol>
<p>This file will be used below to configure signature validation. When using SAML<br>
with Okta, there is no option to dynamically fetch these keys. So when PDC keys<br>
are updated, the integration will not work until re-uploading the PDC keys. Thus<br>
<a href="../idp_okta_oidc">OIDC is preferred</a>) when<br>
using Okta.</p>
<h2>Configure Okta App Integration</h2>
<ol>
<li>
<p>Log in to the admin area to Start a SAML App Integration (these steps follow<br>
<a href="https://help.okta.com/en-us/content/topics/apps/apps_app_integration_wizard_saml.htm">https://help.okta.com/en-us/content/topics/apps/apps_app_integration_wizard_saml.htm</a><br>
)</p>
</li>
<li>
<p>On the left nav bar, visit “Applications” -> “Applications”</p>
</li>
<li>
<p>Click “Create App Integration”</p>
<p><img src="https://philanthropydatacommons.org/wp-content/uploads/2026/02/okta_create_app_integration.png" alt="Create App Integration"></p>
</li>
<li>
<p>Click “SAML 2.0”</p>
<p><img src="https://philanthropydatacommons.org/wp-content/uploads/2026/02/okta_create_a_new_app_integration_SAML.png" alt="SAML 2.0"></p>
</li>
<li>
<p>Click “Next”</p>
</li>
<li>
<p>Set “App Name” to <code>Philanthropy Data Commons</code></p>
</li>
<li>
<p>If you wish to add a logo, one may be found on the <a href="https://philanthropydatacommons.org/">PDC website</a></p>
</li>
<li>
<p>Check “Do not display application icon to users” under “App visibility” to<br>
avoid erroneous IdP-initiated login attempts (because users begin the login<br>
flow from PDC Apps and not from the Okta IdP)</p>
</li>
<li>
<p>Click “Next”</p>
</li>
<li>
<p>Paste the Single sign-on URL endpoint provided by the PDC team, similar to<br>
<code>https://example.org/realms/pdc/broker/foundation-okta-saml/endpoint</code><br>
into Okta’s “Single sign-on URL”</p>
</li>
<li>
<p>Paste the “SP Entity ID URL” provided by the PDC team, similar to<br>
<code>https://example.org/realms/pdc</code> into Okta’s “Audience URI (SP Entity ID)”<br>
field</p>
</li>
<li>
<p>Set the “Name ID format” to <code>EmailAddress</code></p>
</li>
<li>
<p>Set the “Application username” to <code>Email</code></p>
</li>
<li>
<p>Expand “Show Advanced Settings”</p>
</li>
<li>
<p>Ensure both “Response” and “Assertion Signature” are <code>Signed</code></p>
</li>
<li>
<p>Add a “Signature Certificate” PEM file by clicking “Browse files…”,<br>
created [above](#Save the current PDC keys in a PEM file)</p>
</li>
<li>
<p>Add Attribute Statements (case sensitive, use the dropdown for each Value):</p>
<ul>
<li>Map <code>firstName</code>, <code>Basic</code> to <code>user.firstName</code></li>
<li>Map <code>lastName</code>, <code>Basic</code> to <code>user.lastName</code></li>
</ul>
<p><img src="https://philanthropydatacommons.org/wp-content/uploads/2026/02/okta_attribute_statements.png" alt="Attribute Statements map"></p>
</li>
<li>
<p>Click “Next”</p>
</li>
<li>
<p>Click “Finish”</p>
</li>
<li>
<p>Send Okta’s SAML “Metadata URL” value to the PDC team.</p>
<p><img src="https://philanthropydatacommons.org/wp-content/uploads/2026/02/okta_metadata_url.png" alt="SAML Metadata URL"></p>
</li>
</ol>
<p>The PDC team will use this URL to configure an Identity Provider (IdP) within<br>
PDC Keycloak and link it to a PDC Keycloak organization such that when users log<br>
into PDC they will be redirected to their canonical IdP based on the domain name<br>
in the email address. For example, entering “<a href="mailto:
[email protected]">
[email protected]</a>” should<br>
redirect the user to Okta. <a href="https://help.okta.com/en-us/content/topics/users-groups-profiles/usgp-assign-apps.htm">Okta<br>
configuration</a><br>
will determine whether a myfoundation user can log into the PDC. If<br>
“<a href="mailto:
[email protected]">
[email protected]</a>” has been assigned in Okta, then the Okta-configured<br>
login procedure will be used for authentication, and if successful, the user<br>
will be redirected to PDC Keycloak and be granted a valid PDC session.</p>
<h1>PDC Keycloak Configuration with Okta via SAML</h1>
<p>Add a SAML Identity Provider to the PDC Realm.</p>
<p>See also this Keycloak documentation:<br>
<a href="https://www.keycloak.org/docs/26.2.5/server_admin/index.html#_client-saml-configuration">https://www.keycloak.org/docs/26.2.5/server_admin/index.html#_client-saml-configuration</a></p>
<ol>
<li>Visit “Identity Providers”</li>
<li>Click “Add Identity Provider” of type “SAML v2.0.” If none are present such<br>
that “Add Identity Provider” is not available, click “SAML v2.0” under “User<br>
defined”</li>
<li>Set the “Alias” to the descriptive, simple, unique alias named above, e.g.<br>
<code>foundation-okta-saml</code>, <strong>Important</strong>: this alias sets the broker or<br>
“Single Sign-on URL” used by Okta for integration and therefore must match<br>
the “Single Sign-on URL” configured in Okta</li>
<li>Set the “SAML entity descriptor” to the URL sent from the person who<br>
configured Okta. In Okta this is called the “Metadata URL”</li>
<li>Verify that the “NameID policy format” is <code>Email</code> (if not, contact the person<br>
who configured Okta to correct the Okta configuration, refer to Okta’s step 11)</li>
<li>Set the “Principal type” to <code>Subject NameID</code></li>
<li>Set “Want AuthnRequests signed” to <code>On</code></li>
<li>Set “Want Assertions signed” to <code>On</code></li>
<li>Set “Validate Signatures” to <code>On</code></li>
<li>Set “Sign service provider metadata” to <code>On</code></li>
<li>Set “Pass subject” to <code>On</code></li>
<li>Set “Hide on login page” to <code>On</code></li>
<li>Set “Sync mode” to <code>Force</code></li>
<li>Click “Save”</li>
<li>Click the “Mappers” tab on the Identity Provider</li>
<li>Add a map from <code>firstName</code> to <code>firstName</code>:
<ul>
<li>Click “Add mapper”</li>
<li>Set “Name” to <code>Import First Name</code></li>
<li>Leave “Sync mode override” as <code>Inherit</code></li>
<li>Select <code>Attribute Importer</code> from the “Mapper type” dropdown menu</li>
<li>Set “Attribute Name” to <code>firstName</code> <strong>Important:</strong> this attribute name<br>
must match a “Name” set in Okta “Attribute Statements (optional)” for the<br>
import to work</li>
<li>Leave “Name Format” as <code>ATTRIBUTE_FORMAT_BASIC</code></li>
<li>Select <code>firstName</code> from the “User Attribute Name” dropdown</li>
<li>Click “Save”</li>
</ul>
</li>
<li>Add a map from <code>lastName</code> to <code>lastName</code>:
<ul>
<li>Click “Add mapper”</li>
<li>Set “Name” to <code>Import Last Name</code></li>
<li>Leave “Sync mode override” as <code>Inherit</code></li>
<li>Select <code>Attribute Importer</code> from the “Mapper type” dropdown menu</li>
<li>Set “Attribute Name” to <code>lastName</code> <strong>Important:</strong> this attribute name must<br>
match a “Name” set in Okta “Attribute Statements (optional)” for the<br>
import to work</li>
<li>Leave “Name Format” as <code>ATTRIBUTE_FORMAT_BASIC</code></li>
<li>Select <code>lastName</code> from the “User Attribute Name” dropdown</li>
<li>Click “Save”.</li>
</ul>
</li>
</ol>
<p>Link the newly added IdP to its corresponding organization.</p>
<p>See also this Keycloak documentation:<br>
<a href="https://www.keycloak.org/docs/26.2.5/server_admin/index.html#_managing_identity_provider_">https://www.keycloak.org/docs/26.2.5/server_admin/index.html#_managing_identity_provider_</a></p>
<ol>
<li>Visit “Organizations”</li>
<li>Open the organization</li>
<li>Click the “Identity Providers” tab</li>
<li>Click “Link identity provider”</li>
<li>Select the IdP (created above) from the “Identity provider” dropdown menu</li>
<li>Select the organization’s domain name from the “Domain” dropdown menu</li>
<li>Keep “Hide on login page” set to <code>On</code></li>
<li>Set “Redirect when email domain matches” to <code>On</code></li>
<li>Click “Save”.</li>
</ol>
<p><a href="../organization_idp_integration#to-test-an-integration">Test the integration</a></p>
</div></div>