Wednesday, April 8, 2026

The Second Connector Pattern — Writing otherMails to Hybrid Users in Entra ID

ENTRA IDPROVISIONINGHYBRID IDENTITYWORKDAYSSPROTHERMAILS

When you provision hybrid users into Active Directory from Workday and synchronize them to Entra ID via Cloud Sync, you quickly hit a wall: Cloud Sync cannot write otherMails. The attribute exists only on the Entra ID user object — there is no AD equivalent — and Cloud Sync has no mechanism to write cloud-only properties on the accounts it syncs.

For many organizations this matters because otherMails is the personal email address that powers day-one SSPR. Without it populated at account creation, new employees cannot reset their own password until they complete a self-registration flow — which typically requires them to already be logged in.

WHY OTHERMAILS?

otherMails is the Entra ID attribute that SSPR uses as the "Alternate email" reset method. When populated before the user's first login, it enables password reset without prior registration. The personal email originates in Workday's personalEmail field and needs to reach this attribute on the cloud user object.

The Problem in Detail

Here is the flow for a typical hybrid provisioning setup, and where it breaks down:

1

Workday → AD (Connector 1)

The Workday inbound provisioning connector creates the user in on-premises Active Directory. It maps PreferredFirstNameLastNameDepartmentEmployeeID, and other standard attributes. Personal email can be written to an AD extension attribute (e.g. extensionAttribute1) but AD has no otherMails property.

2

AD → Entra ID (Cloud Sync)

Cloud Sync syncs the AD user to Entra ID. It creates the cloud representation of the user with all standard attributes. However, otherMails is a multi-value string array that Entra ID computes and manages — Cloud Sync does not write it. Even if personal email is in extensionAttribute1, there is no supported mapping from that attribute to otherMails in Cloud Sync.

3

otherMails remains empty

The hybrid user lands in Entra ID with no otherMails value. SSPR works only if the user has previously registered, which requires an active account. Day-one password reset fails.

ARCHITECTURE DIAGRAM — SECOND CONNECTOR PATTERN

The key insight is that Entra ID provisioning connectors are not exclusively for creating accounts. They can be configured to update existing accounts only — matching on a stable identifier, skipping creation entirely, and writing a targeted set of attributes via the Microsoft Graph API.

This is the second connector pattern. You deploy a second enterprise application of type "API-driven provisioning to Microsoft Entra ID" (or the Workday → Entra ID cloud connector if you are using the native Workday integration), configured with one critical difference from the primary connector:

THE KEY CONFIGURATION

Create action: OFF. Update action: ON. The connector will only ever match existing accounts and write to them. It will never attempt to create a new user object, regardless of what Workday sends.

Connector Roles Side by Side

CONNECTOR 1 — PRIMARY

Workday → Active Directory

  • Creates hybrid AD accounts
  • Writes all standard AD attributes
  • Manages OU placement
  • Enables / disables accounts
  • Manages manager attribute
  • Handles UPN generation
CONNECTOR 2 — ATTRIBUTE WRITER

Workday → Entra ID (update only)

  • Create: OFF
  • Matches on employeeId
  • Writes otherMails from Workday personalEmail
  • Can also write usageLocation, custom extension attributes
  • Writes any cloud-only property invisible to Cloud Sync

Attribute Mapping Configuration

In the Entra admin center, navigate to the second provisioning app's attribute mappings and configure the following. Keep mappings minimal — only include what this connector is responsible for.

SOURCE (WORKDAY)TARGET (ENTRA ID)APPLY MAPPINGNOTES
WorkerIDemployeeIdMATCH ATTRIBUTEUsed for account matching only — stable Workday identifier
personalEmailotherMailsALWAYSCore purpose of this connector
CountryISOusageLocationALWAYSOptional — also not writable via Cloud Sync
(remove all others)Strip default mappings — this connector should be narrow in scope
IMPORTANT — REMOVE DEFAULT MAPPINGS

When you create the provisioning app, it comes with a full set of default attribute mappings. Delete all of them except the match attribute and otherMails. If you leave displayNameuserPrincipalName, or other attributes mapped, this connector will overwrite values that the primary connector and Cloud Sync are responsible for — potentially causing conflicts and provisioning loops.

Scoping Filter — The Critical Safety Guard

Without a scoping filter, this connector will attempt to process every worker in Workday — including cloud-only users who are already fully managed by a separate cloud-only connector. That creates a race condition where two connectors both write to the same user object.

The scoping filter must match only the hybrid population. Use the same attribute you use to differentiate hybrid from cloud-only workers in Workday — typically Worker_TypeLegal_Entity, or a custom boolean field.

// Scoping filter in the provisioning app — Workday attribute filter
// Only process workers that are in scope for hybrid AD provisioning

Attribute: Worker_Type
Operator:  EQUALS
Value:     "Employee"

// AND

Attribute: Legal_Entity
Operator:  MEMBER_OF
Value:     "Contoso Corp", "Contoso LLC"

// This must mirror the scoping filter on Connector 1 exactly.
// If a worker is in scope for Connector 1 (AD creation),
// they must also be in scope for Connector 2 (attribute enrichment).
SCOPING MUST BE MUTUALLY EXCLUSIVE

The scoping filter on Connector 2 (hybrid attribute writer) and your cloud-only connector must be mutually exclusive. A worker should appear in exactly one connector's scope for update operations. Use the same attribute and values you defined when splitting the two provisioning agents — the same logic that prevents UPN collision applies here.

Provisioning App Settings

In the provisioning app settings, set the following:

// Provisioning app settings (Provisioning > Settings blade)

Provisioning Mode:         Automatic

// Under Mappings > Provision Workday Users
// In the attribute mapping header, set:

Create new objects:        OFF   ← critical
Update matching objects:   ON
Delete matching objects:   OFF   ← never let this connector deprovision

// Matching attribute
Source object attribute:   WorkerID       // Workday
Target object attribute:   employeeId     // Entra ID
Match precedence:          1

What Happens at Runtime

When the provisioning cycle runs for Connector 2:

1

Worker record read from Workday

The connector reads the worker's WorkerID and personalEmail from the Workday data view.

2

Match against Entra ID by employeeId

The provisioning service queries GET /users?$filter=employeeId eq 'WD-12345'. If no match is found — because the AD account has not synced yet — the record is escrowed and retried on the next cycle. No account is created.

3

PATCH otherMails via Graph

The provisioning service issues PATCH /users/{id} with { "otherMails": ["personal@gmail.com"] }. This is a direct Graph write — not through AD, not through Cloud Sync.

4

SSPR is now available on day one

With otherMails populated, the user can reset their password using the alternate email method before their first login — no prior registration required.

Timing Consideration

Connector 2 depends on the account already existing in Entra ID before it runs. The account creation sequence is:

  1. Connector 1 creates the user in AD
  2. Cloud Sync syncs the AD user to Entra ID (~20–40 minutes)
  3. Connector 2 runs its next cycle (~40 minute interval) and finds the account
  4. otherMails is written

In the worst case, otherMails is populated about 80 minutes after account creation. For pre-hire provisioning (account created 1–3 days before start date), this is not an issue. If same-day provisioning is required, a Lifecycle Workflow Logic App custom extension triggered at joiner time is a faster alternative — it fires immediately after the account appears in Entra ID and makes the same Graph PATCH call.

ALTERNATIVE — LIFECYCLE WORKFLOW

If you need otherMails populated within minutes of account creation rather than on the next 40-minute provisioning cycle, deploy a Lifecycle Workflow with a custom task extension (Logic App) that fires on the joiner trigger and calls PATCH /users/{id} with the personal email sourced from a Workday attribute written to an extension attribute at provisioning time.

When to Use This Pattern vs. Alternatives

APPROACHTIMINGCOMPLEXITYBEST FOR
Second connector (this post)~80 min after account creationLow — one additional provisioning appPre-hire provisioning, no Governance license
Lifecycle Workflow + Logic AppMinutes after account appearsMedium — requires Entra ID Governance licenseSame-day onboarding, real-time enrichment
Workday → Entra ID cloud connector (direct)Same cycle as account creationLow — native mapping on cloud-only connectorCloud-only users only — does not help hybrid
Graph API via PowerShell / Azure FunctionOn-demand / scheduledMedium — requires code and scheduled triggerBulk backfill of existing accounts

Summary

Cloud Sync's inability to write otherMails is not a blocker — it is an architectural boundary that the second connector pattern cleanly crosses. The pattern works because Entra ID provisioning connectors are general-purpose Graph API clients: they can update any writable user attribute, and they are not limited to account creation.

The three things that make this pattern safe are:

  1. Create: OFF — the connector cannot create orphan accounts
  2. Narrow attribute mapping — only otherMails and the match key, nothing else
  3. Mutually exclusive scoping — hybrid workers only, mirroring Connector 1's scope exactly

Add this connector to your Workday provisioning architecture alongside the existing AD connector and Cloud Sync, and hybrid users will have their personal email populated in otherMails automatically on every provisioning cycle — no Logic Apps, no custom code, no Governance license required.

LM
Lutz Mueller-HipperCybersecurity Technical Lead & Identity Architect, Insight Enterprises — CISSP — SecAttic • LinkedIn

No comments: