Prerequisites
- A Microsoft Azure account with admin access to create app registrations in Entra ID
- Bifrost Enterprise deployed and accessible
- Your Bifrost callback URL:
https://<your-bifrost-domain>/login
Step 1: Register an application
Open App registrations
Sign in to the Azure Portal and navigate to Microsoft Entra ID → App registrations.Click New registration.
Fill in the registration form
Configure the new registration:

Click Register.
| Field | Value |
|---|---|
| Name | Bifrost SSO |
| Supported account types | Accounts in this organizational directory only (Single tenant) |
| Redirect URI | Web: https://<your-bifrost-domain>/login |

Step 2: Capture app registration information
Step 3: Create app roles (optional)
Add roles to the app registration
This step is optional. App roles are one way to assign Bifrost roles to users, but you can also map any other Entra attribute (e.g. groups, department) instead. Role mapping itself is required.
| Field | Value |
|---|---|
| Display name | Viewer |
| Allowed member types | Users/Groups |
| Value | viewer |
| Description | Viewer role on Bifrost |
| State | Enabled |
developer and admin.
Step 4: Create a client secret
Step 5: Configure API permissions (optional — bulk sync only)
This step is only required if you plan to use bulk user sync (importing users via the User Provisioning page). For standard OIDC login, skip this step — role and team mappings are evaluated from the JWT at login time.
Add the required permissions
In your app registration, go to API permissions and click Add a permission → Microsoft Graph.Add the following Delegated permissions:
openid,profile,email,offline_access,User.Read
User.Read.All,GroupMember.Read.All,Group.Read.AllApplication.Read.All— needed to read the app role catalog during bulk syncAppRoleAssignment.ReadWrite.All— needed to read each user’s app role assignments

Step 6: Configure token claims
Add a groups claim
If you prefer to configure claims via the App Manifest JSON in Step 7, you can skip this step — the manifest overrides UI-based token configuration.

If you configure claims via the Manifest editor instead, also set
"requestedAccessTokenVersion": 2 (or "accessTokenAcceptedVersion": 2 for legacy registrations) and "groupMembershipClaims": "ApplicationGroup" to restrict the groups claim to only app-assigned groups.Step 7: Enable assignment requirement
Open the Enterprise Application
From the Entra ID main menu, go to Enterprise applications and find Bifrost SSO.

Step 8: Assign users and roles
Step 9: Configure Bifrost
Open User Provisioning and choose Entra
In your Bifrost dashboard, go to Governance → User Provisioning.Select Microsoft Entra as the identity provider and click Next.

Fill in the provider configuration
Enter the credentials you collected in Steps 2 and 4:
Click Verify & Next to confirm the connection.
| Field | Value |
|---|---|
| Client ID | Application (client) ID from Step 2 |
| Tenant ID | Directory (tenant) ID from Step 2 |
| Client Secret | The secret value from Step 4 |
| Audience | Your Client ID (optional, defaults to Client ID) |
| App ID URI | api://{client-id} (optional, for v1.0 tokens) |
Discover claims
On the Attribute Mapping screen, click Discover Claims.Bifrost opens a sign-in popup — no session is created. Once you authenticate, it returns the exact claims your Entra tenant is sending in the JWT.Use this to confirm that the attributes you configured in Steps 3 and 6 — such as 
roles and groups — are present before building your mappings.
Set up attribute mappings
Use the sections below the claim list to map Entra claim values to Bifrost roles, teams, and business units.Attribute-to-Role MappingsMap a claim value to a Bifrost role.
Click Next when done.
- All matching rules are evaluated — if multiple rules match, the role with the highest permissions is assigned
- If no rule matches, the user is not assigned a role and login is denied
- Use a specific value (e.g.
engineering) to map that exact claim value to a named Bifrost team - Use
*as the value to sync the claim value directly as the team name - Use
${*}to extract part of the string — e.g.Bifrost Playground: ${*} TeammatchesBifrost Playground: Alpha Teamand creates team Alpha
- Use a specific value (e.g.
platform) to map that exact claim value to a named Bifrost business unit - Use
${*}to extract a substring as the business unit name - When a rule matches, the resolved business unit is assigned to all of that user’s teams

Setting a value to
* maps the claim value directly as the entity name. Value comparisons are case-insensitive.How background sync works
Bifrost uses the app credentials from this setup to sync users in the background every 24 hours. During that sync, Bifrost reconciles imported users, role mappings, team mappings, and business-unit mappings from Entra. Every 15 minutes, Bifrost also refreshes active OIDC sessions. If a session cannot be refreshed, Bifrost checks with Entra whether the user is still active; if Entra reports the user as inactive, Bifrost decommissions that user locally.Optional next steps
Sync users and groups in real time — OIDC alone provisions users on first login. To keep Bifrost in sync with Entra as users are created, deactivated, or moved between groups, set up SCIM with Entra.Troubleshooting
User is not redirected to Microsoft login — verify the provider is enabled in Bifrost and the server was restarted after saving. Check that the Tenant ID and Client ID are correct.AADSTS50011: The reply URL does not match — verify both redirect URIs in Authentication (Step 1) exactly match your Bifrost URLs. Check for trailing slashes or http vs https mismatches.
AADSTS7000215: Invalid client secret — regenerate the client secret in Azure and ensure you are copying the secret Value, not the secret ID. Check for leading/trailing whitespace.
Claim "roles" is not present in the token — the user signed in but Entra did not emit a roles claim. Common causes:
- User isn’t assigned a role at the Enterprise Application level — edit the assignment in Step 9 and select a role
- Role assignment is via a group that isn’t itself assigned to the app — the group must appear in Users and groups with a role selected
- Optional
rolesclaim is missing from the manifest — confirm Step 6 includesrolesunderoptionalClaims.idToken(see the Note at the bottom of Step 6) - Sign out and back in to clear the cached token
Application.Read.All and AppRoleAssignment.ReadWrite.All are granted with admin consent (Step 5). Server logs will contain [ENTRA-ROLES] failed to fetch app role catalog: ... 403 if the permission is missing.
Token validation errors — ensure the Tenant ID matches your Azure directory, the Client ID is correct, and the app registration is in the same tenant as your users.





