content/manuals/enterprise/security/provisioning/scim.md
{{< summary-bar feature_name="SSO" >}}
Automate user management for your Docker organization using System for Cross-domain Identity Management (SCIM). SCIM automatically provisions and de-provisions users, synchronizes team memberships, and keeps your Docker organization in sync with your identity provider.
This page shows you how to automate user provisioning and de-provisioning for Docker using SCIM.
Before you begin, you must have:
SCIM automates user provisioning and de-provisioning for Docker through your identity provider. After you enable SCIM, any user assigned to your Docker application in your identity provider is automatically provisioned and added to your Docker organization. When a user is removed from the Docker application in your identity provider, SCIM deactivates and removes them from your Docker organization.
In addition to provisioning and removal, SCIM also syncs profile updates like name changes made in your identity provider. You can use SCIM alongside Docker's default Just-in-Time (JIT) provisioning or on its own with JIT disabled.
SCIM automates:
[!NOTE]
SCIM only manages users provisioned through your identity provider after SCIM is enabled. It cannot remove users who were manually added to your Docker organization before SCIM was set up.
To remove those users, delete them manually from your Docker organization. For more information, see Manage organization members.
SCIM uses attributes (name, email, etc.) to sync user information between your identity provider and Docker. Properly mapping these attributes in your identity provider ensures that user provisioning works smoothly and prevents issues like duplicate user accounts when using single sign-on.
Docker supports the following SCIM attributes:
| Attribute | Description |
|---|---|
userName | User's primary email address, used as the unique identifier |
name.givenName | User's first name |
name.familyName | User's surname |
active | Indicates if a user is enabled or disabled, set to "false" to de-provision a user |
For additional details about supported attributes and SCIM, see Docker Hub API SCIM reference.
[!IMPORTANT]
By default, Docker uses Just-in-Time (JIT) provisioning for SSO. If SCIM is enabled, JIT values still take precedence and will overwrite attribute values set by SCIM. To avoid conflicts, make sure your JIT attribute values match your SCIM values.
Alternatively, you can disable JIT provisioning to rely solely on SCIM. For details, see Just-in-Time.
To enable SCIM:
The user interface for your identity provider may differ slightly from the following steps. You can refer to the documentation for your identity provider to verify. For additional details, see the documentation for your identity provider:
[!NOTE]
Microsoft does not currently support SCIM and OIDC in the same non-gallery application in Entra ID. This page provides a verified workaround using a separate non-gallery app for SCIM provisioning. While Microsoft does not officially document this setup, it is widely used and supported in practice.
{{< tabs >}} {{< tab name="Okta" >}}
emailNext, set up role mapping.
{{< /tab >}} {{< tab name="Entra ID (OIDC)" >}}
Microsoft does not support SCIM and OIDC in the same non-gallery application. You must create a second non-gallery application in Entra ID for SCIM provisioning.
Next, set up role mapping.
{{< /tab >}} {{< tab name="Entra ID (SAML 2.0)" >}}
Next, set up role mapping.
{{< /tab >}} {{< /tabs >}}
You can assign Docker roles to users by adding optional SCIM attributes in your IdP. These attributes override default role and team values set in your SSO configuration.
[!NOTE]
Role mappings are supported for both SCIM and Just-in-Time (JIT) provisioning. For JIT, role mapping applies only when the user is first provisioned.
The following table lists the supported optional user-level attributes:
| Attribute | Possible values | Notes |
|---|---|---|
dockerRole | member, editor, or owner | If not set, the user defaults to the member role. Setting this attribute overrides the default. |
For role definitions, see Roles and permissions. |
| dockerOrg | Docker organizationName (e.g., moby) | Overrides the default organization configured in your SSO connection.
If unset, the user is provisioned to the default organization. If dockerOrg and dockerTeam are both set, the user is provisioned to the team within the specified organization. |
| dockerTeam | Docker teamName (e.g., developers) | Provisions the user to the specified team in the default or specified organization. If the team doesn't exist, it is automatically created.
You can still use group mapping to assign users to multiple teams across organizations. |
The external namespace used for these attributes is: urn:ietf:params:scim:schemas:extension:docker:2.0:User.
This value is required in your identity provider when creating custom SCIM attributes for Docker.
{{< tabs >}} {{< tab name="Okta" >}}
dockerOrg, dockerTeam, and dockerRole respectively, as listed in the previous table.urn:ietf:params:scim:schemas:extension:docker:2.0:User.If a user doesn't already have attributes set up, users who are added to the group will inherit these attributes upon provisioning.
{{< /tab >}} {{< tab name="Entra ID/Azure AD (SAML 2.0 and OIDC)" >}}
userPrincipalName -> userNamemail -> emails.valuedockerRole, dockerOrg, or dockerTeam using one of the
mapping methods.You can map dockerRole, dockerOrg, or dockerTeam using one of the
following methods:
Use this method if you only need to assign Docker roles like member, editor,
or owner.
Switch(SingleAppRoleAssignment([appRoleAssignments]), "My Corp Admins", "owner", "My Corp Editors", "editor", "My Corp Users", "member")urn:ietf:params:scim:schemas:extension:docker:2.0:User:dockerRole[!WARNING]
You can't use
dockerOrgordockerTeamwith this method. Expression mapping is only compatible with one attribute.
Use this method if you need to map multiple attributes (dockerRole +
dockerTeam).
extensionAttribute1, extensionAttribute2, etc.).dockerRole: urn:ietf:params:scim:schemas:extension:docker:2.0:User:dockerRoledockerOrg: urn:ietf:params:scim:schemas:extension:docker:2.0:User:dockerOrgdockerTeam: urn:ietf:params:scim:schemas:extension:docker:2.0:User:dockerTeamTo assign values, you'll need to use the Microsoft Graph API.
For either mapping method:
If you're using expression mapping:
If you're using direct mapping:
PATCH https://graph.microsoft.com/v1.0/users/{user-id}
Content-Type: application/json
{
"extensionAttribute1": "owner",
"extensionAttribute2": "moby",
"extensionAttribute3": "developers"
}
[!NOTE]
You must use a different extension attribute for each SCIM field.
{{< /tab >}} {{< /tabs >}}
See the documentation for your IdP for additional details:
After completing role mapping, you can test the configuration manually.
{{< tabs >}} {{< tab name="Okta" >}}
{{< /tab >}} {{< tab name="Entra ID/Azure AD (OIDC and SAML 2.0)" >}}
{{< /tab >}} {{< /tabs >}}
If you already have users provisioned through Just-in-Time (JIT) and want to enable full SCIM lifecycle management, you need to migrate them. Users originally created by JIT cannot be automatically de-provisioned through SCIM, even after SCIM is enabled.
Organizations using JIT provisioning may encounter limitations with user lifecycle management, particularly around de-provisioning. Migrating to SCIM provides:
[!IMPORTANT]
Users originally created through JIT provisioning cannot be automatically de-provisioned by SCIM, even after SCIM is enabled. To enable full lifecycle management including automatic de-provisioning through your identity provider, you must manually remove these users so SCIM can re-create them with proper lifecycle management capabilities.
This migration is most critical for larger organizations that require fully automated user de-provisioning when employees leave the company.
Before migrating, ensure you have:
[!WARNING]
This migration temporarily disrupts user access. Plan to perform this migration during a low-usage window and communicate the timeline to affected users.
Before removing users, ensure that any repositories, teams, or organization resources they own are transferred to another administrator or service account. When a user is removed from the organization, any resources they own may become inaccessible.
[!WARNING]
If ownership is not transferred, repositories owned by removed users may become inaccessible when the user is removed. Ensure all critical resources are transferred before proceeding.
Users not assigned to the Docker application in your identity provider are not re-created by SCIM after removal.
Export a list of JIT-provisioned users from Docker Admin Console:
Keep this CSV list of JIT-provisioned users as a rollback reference if needed.
[!IMPORTANT]
Before disabling JIT, ensure SCIM is fully configured and tested in your organization. Do not disable JIT until you have verified SCIM is working correctly.
Disabling JIT prevents new users from being automatically added through SSO during the migration.
[!IMPORTANT]
Users originally created through JIT provisioning cannot be automatically de-provisioned by SCIM, even after SCIM is enabled. To enable full lifecycle management including automatic de-provisioning through your identity provider, you must manually remove these users so SCIM can re-create them with proper lifecycle management capabilities.
This step is most critical for large organizations that require fully automated user de-provisioning when employees leave the company.
[!TIP]
To efficiently identify JIT users, compare the member list exported before SCIM was enabled with the current member list. Users who existed before SCIM was enabled were likely provisioned via JIT.
After removing JIT users, SCIM automatically re-creates user accounts:
Perform post-migration validation:
Keep audit exports and logs for compliance purposes.
After completing the migration:
If a user fails to reappear after removal:
For more troubleshooting guidance, see Troubleshoot provisioning.
If SCIM is disabled, any user provisioned through SCIM will remain in the organization. Future changes for your users will not sync from your IdP. User de-provisioning is only possible when manually removing the user from the organization.
To disable SCIM: