Resource hubGuide

Automating Joiner / Mover / Leaver on Microsoft Entra ID

Provisioning users into Entra ID without hand-written integration code: the Graph API application and permissions you need, the client-credentials authentication, the create and update calls, and why the reusable node matters more than the flow itself.

Monokee Engineering TeamIntegrations

Joiner / Mover / Leaver processes are where identity governance meets a lot of plumbing. The logic is not complicated — someone arrives, someone changes role, someone leaves — but every target system has its own API, its own attribute names and its own idea of what identifies a person, and the integration is traditionally hand-written for each one.

This is how the Entra ID side of that is built in Monokee: as a flow on the Visual Identity Orchestrator, made of steps that can be saved and used again on the next project.

Before you start

Two things have to exist first.

On Microsoft Entra, a tenant with a Graph API application whose permissions have been granted by an administrator. The set needed to read and write users and groups is:

User.Read.All · User.ReadBasic.All · User.ReadWrite.All · Group.Read.All · Group.ReadWrite.All · PrivilegedAccess.Read.AzureAD · PrivilegedAccess.Read.AzureADGroup

On Monokee, a domain to build in. Nothing else: no agent to install on the Entra side, no code to deploy.

Provisioning a user, step by step

1. The person is registered

New users arrive through Monokee’s self-service flows. The attributes captured there are stored in the Monokee identity repository, which from this point on is the source the rest of the process reads from.

2. The account is requested, and approved

The Entra account is not created because a user record exists. It is requested through a dedicated workflow, which raises the request for administrator review. Approval is a step in the flow, not a convention outside it — which is what makes the eventual creation attributable to a decision rather than to a script.

3. Monokee authenticates to Graph

On approval, the flow authenticates against Microsoft Entra using the OpenID Connect client credentials grant. This is machine-to-machine: no user is involved and no user’s session is borrowed, which is what you want for a process that runs at three in the morning as readily as at three in the afternoon.

Figure 1 — Authentication with OpenID Connect and the Graph API

4. The user is created

The flow reads the person’s attributes from the identity vault and computes the ImmutableID as the SHA-256 of the user identifier — a stable, derived value, so the link between the two systems does not depend on anything an administrator might edit later.

Then a single POST to the Graph API creates the account:

{
  "mail": "{{user.username}}",
  "userPrincipalName": "{{user.username}}",
  "onPremisesImmutableId": "{{user.ms_ImmutableID}}",
  "givenName": "{{user.firstName}}",
  "surname": "{{user.lastName}}",
  "displayName": "{{user.firstName}} {{user.lastName}}",
  "accountEnabled": true,
  "mailNickname": "{{user.ms_ImmutableID}}",
  "usageLocation": "IT"
}

The {{…}} placeholders are flow variables: the payload is a template filled from the identity repository at execution time, not a body assembled in code.

Figure 2 — User creation with the Graph API
Figure 3 — Configuration of the user creation node

Mover and Leaver

Changes and departures follow the same shape. The flow reads the current attributes and issues a PATCH to the appropriate Graph endpoint to update the record, or removes it outright.

Worth stating plainly, because it is the point of automating the L as well as the J: a leaver is only closed when the account is actually gone from the target system. A process that provisions automatically and de-provisions by ticket leaves exactly the accounts an access review will later have to find.

The part that pays off twice

The flow above is useful. What makes it worth building is that each step can be saved as a reusable node.

The authentication step, the create call, the update call: once configured, they become building blocks that the next Entra integration starts from instead of redrawing. The work goes into the part that differs — which populations, which approvals, which attributes — rather than into rebuilding the same client-credentials handshake for the fourth time.

That reuse is also why the flow stays readable. A node that has been used on three projects has had its edge cases found on three projects.

Where to go next

The orchestration model is described on the Visual Identity Orchestrator page, the lifecycle process around it on Joiner / Mover / Leaver automation, and the wider set of target systems on Connectors.

Bring us the case underneath this

The version of it that exists in your estate is always more specific. That is the useful conversation.

Talk to an expert