Skip to main content
Version: 1.0

Microsoft Entra ID sign-in

Built and verified 2026-11-07 against a real Entra ID tenant: an app registration with the three Ballast app roles, a user assigned directly to a role, every line of the configuration test, a full sign-in with Microsoft, a sign-in refused once the role was removed, and an open session signed out by the 15-minute re-check.

Available from Ballast 1.0.3. Ballast 1.0.2 and earlier sign in with local accounts and Active Directory only.

Operators can sign in to the Ballast console with their Microsoft work account. Ballast sends them to Microsoft to sign in, so their password, multi-factor prompt and any Conditional Access policy are all handled by Entra ID. Ballast never sees the password. Who gets which role is decided by app roles you assign in Entra, so nobody has to create or delete operator accounts in Ballast by hand.

This is included in every tier, including the free Community tier. It is not licence-gated.

What it does and does not touch​

Entra ID sign-in decides who may sign in to the console and the REST API. That is all.

  • Agents are not affected. Each agent keeps its own certificate identity and carries on enforcing its last-honoured desired state whether or not Microsoft, or the centre itself, is reachable. Turning this on, off, or losing the internet never changes what a host does.
  • The VM and host consoles are not affected. They still use the credential configured for them, not the operator's Microsoft account.
  • Hosts are not joined to Entra ID. This is the console's sign-in only.

How sign-in works​

The sign-in screen gains a Sign in with Microsoft button above the username and password fields.

The Ballast sign-in screen with a Sign in with Microsoft button above the local username and password fields, and a line naming every way in: an Active Directory account, a Microsoft work account, or a local account

StepWhat happens
1The browser goes to Microsoft's sign-in page for your tenant. Entra ID handles the password, multi-factor and Conditional Access.
2Microsoft sends the browser back to Ballast with a one-time code. The centre exchanges it and checks the signed ID token: that it came from your tenant, for your app registration, for this sign-in, and has not expired.
3Ballast reads the app roles in the token. A person holding more than one gets the most privileged.
4A person holding no Ballast role cannot sign in, and is told who can fix that. They are never given a read-only role by default.

The account is stored and shown under the name Entra ID gives it, usually the person's user@example.com. Ballast also keeps the account's object ID, so a renamed account is still recognised as the same person.

The local account is your break-glass login​

The centre needs internet access to reach Microsoft. A console that could only be opened through Microsoft would fail exactly when the centre's network is the thing being repaired. So a local administrator is a permanent requirement:

  • Ballast refuses to turn Entra ID sign-in on unless a local administrator exists.
  • The username and password fields stay on the sign-in screen. Local accounts are never sent to Microsoft and keep working with the centre offline.
  • An Entra ID account can never take over a local account's name. If the names collide, the Entra sign-in is refused.

Before you start​

  • The centre can reach login.microsoftonline.com and graph.microsoft.com over HTTPS.
  • Operators reach the centre over HTTPS by a fixed name, for example https://ballast.example.com. Entra ID only accepts an http redirect for localhost.
  • A local administrator account on the centre.
  • In Entra ID, rights to create an app registration and grant admin consent (Application Administrator or Global Administrator).

1. Register the application​

In the Microsoft Entra admin centre, open Entra ID, App registrations, New registration.

FieldWhat to enter
NameAnything you will recognise, for example Ballast.
Supported account typesSingle tenant only. Ballast refuses a multi-tenant authority.
Redirect URIPlatform Web, and the centre's address followed by /api/v1/auth/oidc/callback, for example https://ballast.example.com/api/v1/auth/oidc/callback. It must match exactly.

Select Register. From the app's Overview page, note the Application (client) ID and the Directory (tenant) ID. You will paste both into Ballast.

2. Create the app roles​

Open App roles, Create app role and create one role per Ballast role you want to use. For each, set Allowed member types to Users/Groups and leave it enabled. The display name and description are yours. The Value must be exactly:

ValueBallast roleWhat it can do
Ballast.AdminAdministratorEverything, including accounts, centre settings and the credential vault.
Ballast.OperatorOperatorFabric and VM operations, but not accounts, centre settings or the credential vault.
Ballast.ReadOnlyRead-onlyView everything, change nothing, and no interactive console.

The app registration's App roles page in the Entra admin centre, listing three roles allowed for Users/Groups with the values Ballast.ReadOnly, Ballast.Operator and Ballast.Admin, all enabled

3. Create a client secret​

Open Certificates & secrets, Client secrets, New client secret. Copy the Value column straight away: Entra ID shows it only once. The Secret ID column is not the secret.

Client secrets expire. Note the expiry date and replace the secret in Ballast before then. An expired secret stops new sign-ins, and Ballast's configuration test says so in those words.

4. Grant the Graph permissions​

Ballast re-checks signed-in users every 15 minutes (see What happens afterwards). To do that it reads Microsoft Graph as the application itself, so it needs three read-only application permissions.

Open API permissions, Add a permission, Microsoft Graph, Application permissions and add:

PermissionWhy
User.Read.AllWhether the account still exists and is enabled.
Application.Read.AllThe app's roles, and who holds them.
GroupMember.Read.AllWhich groups a person is in, for roles assigned to a group.

Then select Grant admin consent for your directory. Each permission's status should read Granted.

The app registration's Configured permissions table: Application.Read.All, GroupMember.Read.All and User.Read.All as Application permissions and User.Read as Delegated, each with a green tick and Granted for the directory

User.Read (delegated) is added by Entra ID to every new registration. Ballast does not use it, and it does no harm. Directory.Read.All on its own also covers all three, if your organisation prefers granting one permission.

5. Assign people to roles​

Open Entra ID, Enterprise applications, then your app, then Users and groups, Add user/group. Pick a user and a role, and assign.

  • Assigning a group needs Entra ID P1 or above. On the free tier of Entra ID you can only assign individual users.
  • A role assigned to a group reaches the group's direct members only. Entra ID does not pass app roles through nested groups.
  • A person listed with Default Access holds no Ballast role and cannot sign in. The owner who created the app is often listed this way.

6. Configure it in Ballast​

Open Settings, Authentication. The Microsoft Entra ID panel is below Active Directory.

Ballast console Settings, Authentication page showing the Microsoft Entra ID panel: tenant ID, client ID, redirect URI, a stored client secret, and a test result where every check passed

FieldWhat to enter
Directory (tenant) IDFrom the app's Overview page. A GUID, not a domain name.
Application (client) IDFrom the same page.
Redirect URIFilled in with the address you have the console open at. It must match the redirect URI registered in step 1 exactly. Change it if operators reach the centre by another name.
Client secretThe Value from step 3. It is stored sealed in the credential vault and never shown again. Leave it blank on later edits to keep the stored one.

The panel's Setting up the app registration section repeats steps 1 to 5 in short form.

7. Test before you turn it on​

Test configuration checks everything without saving it, and reports every step on its own line so you see everything that is wrong at once:

CheckWhat it proves
TenantThe centre reached Microsoft and the tenant ID exists.
Client secretEntra ID accepted the client ID and secret.
Ballast app rolesThe three roles are defined on the app registration, and how many users and groups hold one.
Read accountsThe User.Read.All permission is granted.
Read group membershipThe GroupMember.Read.All permission is granted.

A failed line names the permission or setting to fix.

8. Turn it on​

Tick Sign in with Microsoft Entra ID and Save Entra ID settings. If Ballast refuses, it names the reason; the usual one is that no local administrator exists yet.

The sign-in screen now offers Sign in with Microsoft, with the local account fields below it. Sign out and sign in with Microsoft to confirm.

Signed-in Entra ID users appear under Operator accounts with the source Entra ID, marked Managed in Entra ID.

Operator accounts table listing an Active Directory user, an Entra ID user marked Managed in Entra ID, and a local administrator Their role cannot be edited in Ballast, because it belongs to the app role assignment in Entra. Remove deletes Ballast's record and signs the person out; they can sign in again while they still hold a role.

What happens afterwards​

Ballast checks the token's roles on every sign-in, and asks Microsoft Graph about every signed-in Entra ID user every 15 minutes.

Change in Entra IDEffect in Ballast
The person's role assignment is removedTheir session ends and their record is removed within 15 minutes.
The account is disabled or deletedThe same, within 15 minutes. Entra ID also refuses the next sign-in at once.
They are given a different roleTheir session ends and they get the new role when they sign in again.
The account is renamedRecognised by its object ID; the old name's record is replaced at the next sign-in.
The account is unaffectedNothing changes.
Microsoft cannot be reached, or Graph refuses the centreNobody is signed out. Sessions already open keep working. New Entra ID sign-ins fail with a message pointing at a local account; local accounts are unaffected.

The last row is deliberate. "Microsoft did not answer" is never treated as "the answer is no". An expired client secret or a withdrawn Graph permission is an administrator's problem to fix, not a reason to sign every operator out. Only a definite answer from Entra ID ends a session.

Turning Entra ID sign-in off signs its users out at the next check and leaves the local accounts as they are.

Limits to know about​

  • One tenant. Accounts are signed in against your own tenant only. Ballast refuses a multi-tenant app registration.
  • The global Microsoft cloud. National clouds (US Government, China) are not supported yet.
  • No SAML. This is OpenID Connect against Entra ID only. Other identity providers are not supported yet.
  • Roles through groups are not yet verified live. Direct user assignment is, and the configuration test confirms the centre can read group membership. A role held through a group follows the same rules but has not been exercised against a real tenant, because assigning groups needs Entra ID P1.
  • The console and REST API only. See the top of this page.

Troubleshooting​

Sign-in failures name the cause and the fix. The common ones:

You seeWhat it meansWhat to do
user holds no Ballast roleThe person signed in, but holds none of the three app roles.Assign them a role under Enterprise applications, Users and groups. Default Access is not a role.
Your account is not assigned to the Ballast appThe app requires assignment and this person has none.Assign them a role, as above.
The redirect URI Ballast sent is not registeredThe Redirect URI in Ballast does not exactly match one on the app registration.Copy it from Ballast into the app's Authentication page, or correct it in Ballast.
Entra ID refused the client secretThe secret is wrong, expired, or is the Secret ID rather than the Value.Create a new secret and paste its Value.
Entra ID does not recognise the tenantThe tenant ID is mistyped.Copy the Directory (tenant) ID from the app's Overview page.
Graph refused the centre ... Grant the app registration the permissionA Graph permission is missing or admin consent has not been granted.Add the named permission and grant admin consent.
The centre could not reach Microsoft Entra IDThe centre has no route to login.microsoftonline.com.Sign in with a local account, then fix the centre's outbound HTTPS or proxy.
This sign-in was not started from this browser, or took longer than ten minutesThe sign-in was left open too long, or started in a different browser.Select Sign in with Microsoft again.
Keep at least one local administrator before enabling Entra ID sign-inThere is no local administrator to fall back on.Create one under Operator accounts.
user is already an account on this centre from another sourceA local or Active Directory account has the same name.Remove or rename that account first.