Configure sign-in with Microsoft Entra ID.
This is the operator guide for wiring the BARRY UI against Microsoft Entra ID (formerly Azure AD) — the configurable alternative to the default Keycloak provider. For the concepts behind login and roles, read Authentication & Roles first.
Like Keycloak, Entra uses the Backend-for-Frontend pattern: the SPA never sees tokens; the server runs the authorization-code flow and issues a session cookie. Users and roles live entirely in Entra.
https://<frontend-host>, and the local-dev origin for development).In the Entra portal, create an App registration:
BARRY.From the overview page, copy the Application (client) ID and the Directory (tenant) ID into the runtime configuration.
Under Authentication → Add a platform → Web, add one redirect URI per environment, always with the path /signin-oidc (e.g. https://<frontend-host>/signin-oidc). Add the matching front-channel logout URL …/signout-callback-oidc. Leave the implicit grant checkboxes unchecked — the runtime uses the code flow only.
A confidential client needs a credential to exchange the authorization code for tokens:
The basic sign-in and role-mapping flow needs no Microsoft Graph permissions — everything is read from the ID token. Granting tenant-wide admin consent once is recommended so users are not prompted on first sign-in.
Under App roles, create three roles. The value of each must match exactly:
Admin — full control.Operator — operate clients and trigger transports; no settings.Viewer — read-only.Roles are hierarchical in the backend (Admin satisfies Operator and Viewer; Operator satisfies Viewer).
App-role values appear in a user's token only if the user is assigned to the application:
A common pattern is to create three security groups (Admins, Operators, Viewers) and assign the groups to the roles, so membership is managed in the group. Group claims are not required — Entra emits the role claim for app-role assignments either way.
A user without an assignment signs in successfully but the application shows Access denied (the token carries no role claim).
The minimum configuration the server needs:
BARRY_AUTH_PROVIDER=Entra
BARRY_ENTRA_TENANT_ID=<directory (tenant) id>
BARRY_ENTRA_CLIENT_ID=<application (client) id>
BARRY_ENTRA_CLIENT_SECRET=<secret value from step 3>
For production on Azure, prefer a federated identity credential plus a managed identity over a stored client secret, which removes secret rotation from the operational burden entirely.
AADSTS50011: redirect URI does not match — the exact origin you accessed the UI under is missing from the app's redirect URIs.AADSTS7000215: invalid client secret — you copied the secret's ID instead of its value, or it expired.AADSTS65001: not consented — grant admin consent under API permissions./api/me returns 403 with empty roles — the user has no app-role assignment; assign them under Enterprise applications → Users and groups.You are currently viewing a placeholder content from Vimeo. To access the actual content, click the button below. Please note that doing so will share data with third-party providers.
More InformationYou are currently viewing a placeholder content from YouTube. To access the actual content, click the button below. Please note that doing so will share data with third-party providers.
More InformationYou need to load content from reCAPTCHA to submit the form. Please note that doing so will share data with third-party providers.
More InformationYou are currently viewing a placeholder content from Vimeo. To access the actual content, click the button below. Please note that doing so will share data with third-party providers.
More InformationYou are currently viewing a placeholder content from YouTube. To access the actual content, click the button below. Please note that doing so will share data with third-party providers.
More InformationYou are currently viewing a placeholder content from Bunny Stream. To access the actual content, click the button below. Please note that doing so will share data with third-party providers.
More InformationYou are currently viewing a placeholder content from Wistia. To access the actual content, click the button below. Please note that doing so will share data with third-party providers.
More Information