This component lets Azure AD (Microsoft Entra) provision users to OutSystems ODC using SCIM 2.0. There’s no UI — it works behind the scenes and listens for SCIM requests from Azure to create, update, or deactivate users.
Here’s how to set it up:
1. Install the Component
Publish the Azure SCIM Server module to your ODC environment.
Make sure your app is accessible publicly. You’ll need the full HTTPS URL (e.g., https://.outsystems.app) for Azure provisioning.
https://.outsystems.app
2. Set Up Site Properties🛠 Get Your ODC API Client ID and Secret
In ODC, go to your Users API application (or wherever you're calling /api/identity/v1/users).
/api/identity/v1/users
Under the Service Center > API Clients section, create a new API Client.
Copy the generated Client ID and Client Secret — you'll need both for authentication.
Make sure your API Client has permission to call the OutSystems Identity API.Official API docs here: ODC REST APIs
🔐 Configure Site Properties
Go to Service Center and update these values:
ClientId
ClientSecret
SCIMToken
Azure will pass this token as a Bearer token in the Authorization header for all requests. This is how the component verifies requests are from Azure.
3. Create the Enterprise App in Azure AD
In Azure AD, go to Enterprise Applications > + New application.
Choose “Non-gallery application”.
Name it (e.g., ODC SCIM Provisioning) and create the app.
ODC SCIM Provisioning
4. Enable SCIM Provisioning
Inside the app, go to Provisioning.
Set Provisioning Mode to Automatic.
Automatic
Use this as the Tenant URL:
rubyCopyEdithttps://.outsystems.app/api/scim/v2
https://.outsystems.app/api/scim/v2
Use the same value you set in SCIMToken as the Secret Token.
5. Test Connection
Click Test Connection in Azure.
This sends a GET request to /ServiceProviderConfig. If everything is configured correctly, you’ll see a success message.
/ServiceProviderConfig
6. Configure Attribute Mappings
Azure sends these attributes by default:
userName
name.givenName
name.familyName
emails[type eq "work"].value
active
These map directly to the UserExtension entity in the component. Unless you have custom needs, the defaults will work out-of-the-box.
UserExtension
7. Start Provisioning
Go to Users and Groups in your Enterprise App.
Assign a test user.
Navigate to Provisioning > Provision on demand.
Search for the user and click Provision to trigger a manual sync.
This will send a POST or PATCH request to your /Users endpoint. Once verified, you can let Azure handle auto-provisioning for assigned users.
POST
PATCH
/Users
✅ What This Component Does
Exposes the following SCIM endpoints:
POST /Users (create)
POST /Users
PATCH /Users/{id} (update/deactivate)
PATCH /Users/{id}
GET /ServiceProviderConfig (for Azure connection testing)
GET /ServiceProviderConfig
Validates SCIMToken in the Authorization header for every request.
Uses UserExtension to store user details and check if a user exists locally — reducing the need to re-query ODC.
Calls the ODC Users API (via /api/identity/v1/users) to create or update accounts.
Uses the OpenIdToken entity to store the access token from ODC so we don't request a new one on every call.
OpenIdToken
Includes auto-refresh logic: it checks if the token is about to expire, and only then does it call the ODC Token API again. This keeps things secure and efficient.
⚠️ Limitations
This version only supports the /Users endpoint. Group provisioning (/Groups) is not included because my Azure account (free tier) doesn’t support it yet — but it’s on the roadmap.
/Groups
Only core SCIM functionality is implemented. Extensions like /Schemas, /Me, and bulk operations are not part of this release.
/Schemas
/Me
🧪 Testing
To help with testing, I’ve shared a ready-to-use Postman collection here:👉 https://github.com/michaeldeguzman/ODC
It’s important to test with Postman (or something similar) because users created or updated through SCIM don’t show up in the ODC Portal’s Users screen.
You can validate them by checking the UserExtension entity or calling the ODC Identity API directly.