Connector Configuration
Learn how to configure and connect Identity Mesh to your identity providers and target systems.
Supported Connectors
Identity Mesh supports a wide range of identity providers and target systems through its connector framework.
Active Directory
LDAPConnect to on-premises or cloud-hosted Active Directory
Microsoft Entra ID
Azure ADGroups write-backImport users and groups from Microsoft Entra ID (formerly Azure AD). Create groups and manage members and owners through Microsoft Graph. User write-back on the roadmap.
Okta
SCIMImport onlyImport users and groups from the Okta identity platform (read-only today)
Workday
REST APIName/email write-backImport workers from Workday HCM for HR-driven provisioning, and write corrected preferred names and work email addresses back
LDAP
LDAPComing SoonGeneric LDAP connector for any LDAP-compliant directory
SCIM 2.0
SCIMComing SoonStandard SCIM 2.0 connector for any SCIM-compliant system
SQL Database
SQLDirect database connector for custom identity stores
REST API
RESTComing SoonGeneric REST API connector for custom integrations
Active Directory Configuration (Import and export)
The Active Directory connector imports and exports one or more object types from a forest. New in this release, the connector is configured around a single ObjectTypes list that says which classes to import, which attributes to load for each, and how each type is created and deleted on export. The list is defined once per connector, because a forest has exactly one schema, and it applies to every domain the connector reads.
Prerequisites
- Active Directory domain controller accessible from Identity Mesh (or from the relay agent that runs the connector)
- Service account with read permissions (or read/write for bi-directional sync), supplied through the connector's authentication settings as a secret reference, never in the config JSON
- LDAP port 389 (or LDAPS port 636) open in firewall. LDAPS (port 636) is required for password provisioning via
EnableAfterCreate - Base DN for the domain (or one per domain when the connector spans a forest)
Configuration Example
{
"type": "active-directory",
"name": "Corporate AD",
"config": {
"LdapServer": "dc01.corp.contoso.com",
"LdapPort": 636,
"UseSsl": true,
"BaseDn": "DC=corp,DC=contoso,DC=com",
"PageSize": 500,
"ExternalIdAttribute": "objectGUID",
"DeltaAttribute": "uSNChanged",
"EnableAfterCreate": true,
"DeleteMode": "disable",
"ObjectTypes": [
{
"Name": "user",
"Attributes": [
"sAMAccountName", "userPrincipalName", "mail", "givenName", "sn",
"displayName", "employeeNumber", "manager", "objectSid"
],
"Filter": null,
"Export": {
"CreateEnabled": true,
"DefaultContainer": "OU=Staff,DC=corp,DC=contoso,DC=com",
"DeleteMode": "disable"
}
},
{
"Name": "group",
"Attributes": ["cn", "member", "managedBy", "groupType"],
"Filter": "(&(objectClass=group)(groupType:1.2.840.113556.1.4.803:=2147483648))",
"Export": {
"CreateEnabled": true,
"DefaultContainer": "OU=Groups,DC=corp,DC=contoso,DC=com",
"DeleteMode": "delete"
}
}
]
}
}Connection Fields
0) to pick 389 or 636 automatically from UseSslId, LdapServer, BaseDn, credentials and optional Filter. When absent, the flat fields above describe a single domain. The object-type list is shared by every domain.objectGUIDuSNChangeduserAccountControl 512). Requires UseSsl: true and a unicodePwd projection attribute rule with a GeneratePassword() transform. Default: falsedisable, disable-or-delete or delete; see Delete modes below. Each object type can override it. Default: disableObject Types
Each entry in ObjectTypes names one structural class the connector handles. In the Admin Portal this is the What to import and export step of the AD connector form: type chips, a class search backed by the forest schema, a per-type attribute picker scoped to that class, and the export defaults with an OU browser. The connector always keeps at least one type; the last remaining type cannot be removed.
user, group, contact, computer, inetOrgPerson, or any class the schema discovery returns. Compared case-insensitively. This is also the target object type a projection rule refers to.objectSid, which is imported as a string in the usual S-1-5-... form.(&(objectClass=user)(!(objectClass=computer))) for user and (objectClass=group) for group. In the portal the combined filter is shown read-only under Advanced, because it is derived from the types on save.false, an Add fails with a message naming the type; updates and deletes are unaffected. Absent means true.DeleteMode for this type. Absent means inherit.How the Import Is Built
- • The connector runs one LDAP search per domain. The filter is the OR of every type's clause, and the requested attributes are the union of every type's list plus
objectGUID,uSNChangedandobjectClass. - • Each returned entry is typed from its
objectClass, so a single search feeds every configured type. - • A domain's own
Filter(on aPartitionsentry) replaces the whole derived filter for that domain, not just one type's clause. - • When you save a connector, the API warns if an attribute flow rule maps an attribute that no type will load. Add the attribute to the right type, or the flow will never see a value.
Delete Modes
A Delete export reaches the connector when a projection rule with DeleteIfUnlinked stops matching an object that exists in AD, or when a self-service group is removed. The mode decides what the connector does with it. Values are matched case-insensitively.
| Mode | Behaviour |
|---|---|
| disable | Default. Sets the ACCOUNTDISABLE bit and never removes anything. Groups and contacts have no userAccountControl, so the write is attempted, Active Directory rejects it, and the queue item fails loudly instead of the object being deleted. |
| disable-or-delete | Disables user-class objects and deletes everything else. The object's class is read from the directory before the write; with no class list, nothing is destroyed. Required for self-service groups, so that deleting a group in the portal removes it from AD. |
| delete | Removes the object, whatever its class. |
| (anything else) | Treated as disable. A typo can never be the destructive choice. |
Export Behaviour Notes
- • Single-valued DN references such as
manager,managedByandsecretaryare resolved to the referenced object's DN on updates as well as creates. - • An attribute sent with an explicit empty value is cleared in AD. An attribute absent from the change is left untouched.
- •
distinguishedNameis never written; the object's DN comes from its container and RDN. - • Group membership is written as a replace, so emptying an already-empty group succeeds.
Schema Discovery
The class search in the portal is backed by an endpoint that reads the forest schema and returns every structural class with its required and optional attributes. You can call it directly with the connector's config JSON; credentials are resolved the same way the connector resolves them at run time, so a secret reference works. Requires connectors.write.
POST /api/connectors/discover-classes
Content-Type: application/json
Authorization: Bearer {{api_token}}
{
"configJson": "{ \"LdapServer\": \"dc01.corp.contoso.com\", \"BaseDn\": \"DC=corp,DC=contoso,DC=com\", \"UseSsl\": true }",
"partitionId": null
}Upgrading an existing AD connector
The portal still writes the legacy ObjectType, Filter and AttributesToLoad keys alongside the new list, so a relay agent that has not been upgraded keeps importing. Per-type export defaults, however, need the new connector build on the agent. Upgrade the relay agent MSI with, or before, the engine.
A connector created before this release without an AttributesToLoad key should be opened once in the connector form, and its per-type attribute cards checked, before the next full import.
Microsoft Entra ID Configuration (Users import, groups write-back)
Prerequisites
- Azure AD tenant with appropriate licensing
- App registration in Azure AD with required API permissions
- Client ID and client secret from app registration
- Tenant ID (directory ID)
Configuration Example
{
"type": "entra-id",
"name": "Contoso Entra ID",
"config": {
"TenantId": "12345678-1234-1234-1234-123456789abc",
"GroupSelectionFilter": "startswith(displayName,'IM-')",
"PageSize": 999,
"ImportUsers": true,
"ImportGroups": true,
"ImportMemberships": true,
"ExternalIdAttribute": "id",
"ObjectTypes": [
{ "name": "User", "attributes": ["id", "userPrincipalName", "displayName", "mail", "department", "jobTitle", "accountEnabled"] },
{ "name": "Group", "attributes": ["id", "displayName", "mailNickname", "groupTypes", "securityEnabled"] }
]
},
"auth": {
"Mode": "ClientSecret",
"ClientId": "87654321-4321-4321-4321-cba987654321",
"ClientSecret": "secret://entra/contoso/clientsecret"
}
}Required API Permissions
Grant these Microsoft Graph API permissions to your app registration:
- User.Read.AllRead all users' full profiles
- Group.Read.AllRead all groups
- Directory.Read.AllRead directory data
Okta Configuration (Import only)
Configuration Example
{
"type": "okta",
"name": "Okta Production",
"config": {
"OrgDomain": "contoso.okta.com",
"UserSearchFilter": "status eq \"ACTIVE\"",
"PageSize": 200,
"ImportUsers": true,
"ImportGroups": true,
"ImportMemberships": true,
"ExternalIdAttribute": "id"
},
"auth": {
"Mode": "ApiKey",
"ApiKey": "secret://okta/contoso/apitoken"
}
}SQL Database Configuration
Prerequisites
- SQL Server instance accessible from Identity Mesh
- Database account with read permissions on the source table or view
- A
datetime2column for delta tracking (notdatewhich lacks time granularity) - A unique identifier column for each row (e.g., primary key)
Configuration Example
{
"type": "sql",
"name": "HR Database",
"config": {
"connectionString": "Server=hrdb.company.com;Database=HRSystem;",
"importQuery": "dbo.Employees",
"externalIdColumn": "EmployeeId",
"objectType": "User",
"deltaColumn": "ModifiedDateUtc",
"deltaColumnType": "datetime",
"softDeleteColumn": "IsActive",
"softDeleteValue": "false",
"columnsToLoad": ["EmployeeId", "Email", "DisplayName", "Department", "Title", "ManagerEmail"]
}
}Configuration Fields
dbo.Employees)Iddatetime2, bigint, or rowversion. You can use either deltaColumn or watermarkColumn in the config JSON.datetime, long, bigint, rowversion, or binary. Default: datetimeisActiveColumn as an alias — when used, the semantics are inverted automatically (IsActive=0 means deleted).bit columns, use 0 or 1. Default: true. When using isActiveColumn, this defaults to 0 automatically.*. Reduces network I/O and memory for wide tables. The externalIdColumn, deltaColumn, and softDeleteColumn are always included automatically. Omit or set to [] for SELECT *.Delta Column Type Matters
The delta column must be datetime2 — not date. A date column stores only the date with no time component, so multiple changes on the same day would be missed during delta imports. Use datetime2 for millisecond-level granularity.
Dynamic Target Container
Projection rules support {{attribute}} templates in the Target Container field. At projection time, tokens are resolved against the mesh object's attributes, placing objects into different OUs automatically.
OU={{department}},OU=Users,DC=corp,DC=comIf a user's department attribute is Engineering, the resolved container becomes OU=Engineering,OU=Users,DC=corp,DC=com. Unresolved tokens (missing or null attributes) are left as-is.
Authentication Modes
tenantId)Testing Your Connection
After configuring your connector, test the connection to ensure it's working properly. In the Admin Portal, open the connector under Connectors and click Test Connection. The test runs on the host that will run the connector: the sync engine for a Direct connector, or the assigned relay agent for a relay-routed one, so it checks the same credentials and network path a sync will use.
What the result shows
Connection successful (ran on engine: IMSYNC01)
or, on failure, the error returned by the target system, for example:
Connection failed: The LDAP server is unavailable. (ran on relay: HQ-RELAY-01)A failure names the host the test ran on, so a relay-routed connector that fails here points at that relay host's network path or service account, not at the Admin API server.