IAM HR Sync Jobs
Overzicht
De IAM HR Sync functionaliteit gebruikt een batch-based pipeline van background jobs die sequentieel worden uitgevoerd. De jobs worden automatisch gescheduled via een dispatcher, of kunnen handmatig getriggerd worden vanuit de frontend.
Job Pipeline
Dispatcher Job (Scheduler)
Job: IamEmployeeScheduleDispatcherJob Display Name: "IAM Employee Dispatch HR Sync jobs" Schedule: Elke 15 minuten (via Hangfire recurring job) Duur: < 1 seconde
Verantwoordelijkheden:
Scant alle tenants met actieve HR Sync configuratie
Checkt of een sync run gepland staat volgens de CRON schedule
Voorkomt concurrent execution - max 1 sync per tenant tegelijk
Enqueued Job 1 (PreConfigurationCheckJob) in een Hangfire batch
Concurrency Control: De dispatcher voorkomt race conditions door:
Primary guard: Check Hangfire storage voor actieve jobs
Secondary guard: Check IAM tables voor running batches
Tertiary guard: Check last known job state
Logging:
Pipeline Jobs (Sequentieel Uitgevoerd)
Wanneer de dispatcher een sync triggert, wordt een batch aangemaakt met de volgende jobs. Deze draaien altijd sequentieel via ContinueJobWith - er zijn geen race conditions mogelijk.
Job 1: Pre-Configuration Check
Job: IamEmployeePreConfigurationCheckJob Display Name: "IAM Employee Pre configuration check" Duur: ~5-10 seconden
Verantwoordelijkheden:
π Resolve pipeline op basis van
DestinationNameuit tenant sync settingsβ Voert alle pre-configuratie checks uit die bij de pipeline horen
β Schedule pipeline jobs in de batch (als checks slagen)
Pipeline-specifieke checks:
Pipeline | Checks |
|---|---|
Entra AD | ProvisioningSchema, Credentials, JobActive, SchemaHashPresent, SchemaHashMatch, EmailConfiguration |
Entra | EmailConfiguration |
Bij failure:
Disable (prioriteit laag): Scheduled
IamEmployeeDisableSyncJoben stopt de pipelineFail (prioriteit hoog): Markeert batch als failed en gooit exception
Bij meerdere failures: de check met de laagste
FailurePrioritybepaalt de actie
Logging:
Output:
Persists step result in
IAM_Employee_Sync_Batch_Steps(backward-compatible JSON)Bij success: scheduledt pipeline-specifieke jobs
Job 2: Get HR Data
Job: IamEmployeeGetHrDataJob Display Name: "IAM Employee GetHrData" Duur: ~30-60 seconden (afhankelijk van HR-systeem response tijd)
Verantwoordelijkheden:
Ophalen van alle employees uit de source connector (bijv. SAP SuccessFactors)
Roept
ISourceConnector.GetEmployeesAsync()aanGeen filtering - haalt complete dataset op
Logging:
Output:
Serialized employee list naar JSON
Opgeslagen in
IAM_Employee_Sync_Batch_Steps(step 2)
Job 3: Translate HR Data
Job: IamEmployeeTranslateHrDataJob Display Name: "IAM Employee TranslateHRData" Duur: ~10-30 seconden
Verantwoordelijkheden:
Haalt employees op uit Job 2 output
Past destination translation schema toe (welke velden actief zijn)
Voert domain validation uit (UPN moet in Entra domains)
Detecteert duplicaten in source data
Filtert employees met ongeldige domains of duplicaten uit
Merge unmatched source employees met schema compliance
Validaties:
β UPN domain in Entra domain list?
β Geen duplicate EmployeeId/Email/Username?
β Velden enabled in destination schema?
Logging:
Output:
Filtered en validated employee list
Opgeslagen in
IAM_Employee_Sync_Batch_Steps(step 3)
Job 4: Send to Entra Provisioning
Job: IamEmployeeSendToEntraProvisioningJob Display Name: "IAM Employee SendToEntraProvisioning" Duur: ~1-5 minuten (afhankelijk van aantal employees)
Verantwoordelijkheden:
Haalt validated employees uit Job 3 output
Bouwt SCIM 2.0 BulkRequest payloads (max 50 per batch)
Submits bulkUpload requests naar Microsoft Graph API
Slaat batch IDs op voor latere log retrieval
Batching:
Max 50 employees per SCIM bulk request
Bij 245 employees → 5 batches van 50 + 1 batch van 45
Logging:
Output:
List van submission batch IDs
Opgeslagen in
IAM_Employee_Sync_Batch_Steps(step 4)
Job 5: Read Logs
Job: IamEmployeeReadLogsJob Display Name: "IAM Employee ReadLogs" Duur: ~2-10 minuten (afhankelijk van provisioning completion)
Verantwoordelijkheden:
Haalt batch IDs uit Job 4 output
Pollt Microsoft Graph API voor provisioning logs
Wacht tot alle batches compleet zijn (max timeout)
Parseert logs voor succesvolle creations en errors
Identificeert nieuwe accounts die een initial password nodig hebben
Polling:
Interval: elke 10 seconden
Max duration: 30 minuten
Stopt wanneer alle batches status "Completed" hebben
Logging:
Output:
List van nieuwe user UPNs
Opgeslagen in
IAM_Employee_Sync_Batch_Steps(step 5)
Job 6: Set Initial Password
Job: IamEmployeeSetInitialPasswordJob Display Name: "IAM Employee SetInitialPassword" Duur: ~30-120 seconden
Verantwoordelijkheden:
Haalt nieuwe user UPNs uit Job 5 output
Genereert random initial passwords
Zet passwords via Microsoft Graph API
Verstuurt password emails naar geconfigureerd email adres
Markeert users als "ForceChangePasswordNextSignIn"
Email:
Naar:
IAM_Employee_Sync_Settings.InitialPasswordEmailFixedToBevat: UPN en initial password per nieuwe user
Logging:
Output:
Success/failure status per user
Opgeslagen in
IAM_Employee_Sync_Batch_Steps(step 6)
Job 7: Update Fields
Job: IamEmployeeUpdateFieldsJob Display Name: "IAM Employee UpdateFields" Duur: ~10-30 seconden
Verantwoordelijkheden:
Update employee fields in local database (nog niet geïmplementeerd in huidige versie)
Placeholder voor toekomstige field updates
Logging:
Job 8: Trigger Workflows
Job: IamEmployeeTriggerWorkflowsJob Display Name: "IAM Employee TriggerWorkflows" Duur: ~5-15 seconden
Verantwoordelijkheden:
Triggert workflow dispatcher jobs voor nieuwe/gewijzigde employees
Enqueued
WorkflowEmployeeCreatedDispatcherJobvoor nieuwe usersEnqueued
WorkflowEmployeeUpdatedDispatcherJobvoor updates
Logging:
Output:
Workflow job IDs
Opgeslagen in
IAM_Employee_Sync_Batch_Steps(step 8)
Job Dependencies (Sequentieel)
De pipeline wordt dynamisch bepaald op basis van de DestinationName uit de tenant settings.
Entra AD Pipeline (Hybrid Identity)
Entra Pipeline (Cloud-only)
Belangrijke eigenschappen:
β Jobs draaien altijd sequentieel via Hangfire
ContinueJobWithβ Geen race conditions - elke job wacht op de vorige
β Max 1 sync per tenant tegelijk - dispatcher voorkomt concurrency
β Atomic batches - hele pipeline slaagt of faalt als geheel
β Audit trail - elke step result wordt opgeslagen
β Pipeline per bestemming - checks en jobs worden dynamisch bepaald
Triggering
Automatisch (Scheduled)
Configuratie per tenant:
CRON schedule in
IAM_Employee_Sync_Settings.ScheduleCronVoorbeeld:
0 2 * * *(dagelijks om 02:00 UTC)Voorbeeld:
7,37 * * * *(elk uur op minuut 7 en 37)
Dispatcher:
Draait elke 15 minuten
Scant 15-minuten window voor scheduled runs
Enqueued alleen als CRON match binnen window
Handmatig (Frontend)
Via Management Portal:
Ga naar IAM HR Sync → Sync
Klik op "Start Sync Now" (triggert Job 1 via API)
Monitor voortgang in Aspire Dashboard of Jobs dashboard
API Endpoint (optioneel):
Externe Opslag Transfer Jobs
Naast de sync pipeline zijn er twee aparte jobs verantwoordelijk voor het nachtelijk exporteren van gefinaliseerde audit log batches naar externe opslag. Ze staan volledig los van de sync pipeline: een mislukte transfer blokkeert nooit een sync run.
IamEmployeeAuditLogStorageDispatcherJob
Beheert de lifecycle van nachtelijke recurring transfer jobs per tenant. Registreert een Hangfire recurring job (CRON 0 2 * * *, tenant timezone) voor elke tenant met ExternalStorageEnabled = true, en verwijdert verouderde recurring jobs voor tenants die externe opslag hebben uitgeschakeld.
IamEmployeeAuditLogStorageTransferJob
Draait nachtelijk om 02:00 per tenant. Haalt gefinaliseerde audit log batches op sinds het laatste watermark (ExternalStorageLastTransferredAt), streamt de records naar JSON en uploadt ze naar de geconfigureerde opslaglocatie als yyyy-MM-dd/HH-mm-ss_iam-sync-audit-log.json. Bij een mislukte upload herprobeert Hangfire tot 3 keer; pas na de definitief mislukte poging wordt een e-mailnotificatie verstuurd.
Retry attributes: [AutomaticRetry(Attempts = 3)], [DisableConcurrentExecution(timeoutInSeconds: 900)]
Zie IAM HR Sync — Externe Opslag Transfer voor de volledige technische beschrijving, inclusief flow, retry-gedrag, silent-skip guards en watermark-integriteit.
Monitoring
Job Dashboard URLs
Productie:
Development:
Local/Test:
Via Hangfire Dashboard
Ga naar de job dashboard URL voor jouw omgeving
Zoek naar "IAM Employee" jobs
Check status: Enqueued, Processing, Succeeded, Failed
Bij failures: check "Failed" tab voor error details
Via Aspire Dashboard (Development)
Open Aspire Dashboard (
http://localhost:15888)Ga naar Traces tab
Filter op "IAM Employee" of tenant ID
Bekijk distributed trace voor complete pipeline
Via Audit Logs
Alle jobs loggen naar IAM_Employee_Sync_Batches:
Per-step results:
Troubleshooting
Job blijft hangen in "Processing"
Probleem: Job status blijft "Processing" en completeert niet.
Oplossing:
Check Hangfire dashboard voor error details
Check Aspire/Seq logs voor exceptions
Bij timeout (>30 min): requeue handmatig via dashboard
Check of source system bereikbaar is (voor Job 2)
Sync wordt automatisch disabled
Probleem: Job 1 scheduled een DisableSyncJob.
Oorzaak:
Schema hash mismatch
Provisioning job niet actief
Email configuratie ontbreekt
Oplossing:
Check audit logs voor exacte reden
Los probleem op (zie edge cases documentatie)
Re-enable sync via Management Portal
Jobs draaien niet volgens schedule
Probleem: Dispatcher enqueued geen nieuwe sync.
Oorzaak:
CRON syntax incorrect
Sync not active in settings
Previous batch still running
Oplossing:
Concurrent execution detected
Probleem: Dispatcher skipped enqueue omdat er al een batch draait.
Oorzaak:
Previous batch niet afgesloten
Hangfire job stuck
Oplossing:
Check Hangfire voor stuck jobs
Delete/requeue stuck job via dashboard
Retry dispatcher na cleanup