DocumentationConnector Configuration

Connector Configuration

Learn how to configure and connect Identity Mesh to your identity providers and target systems.

Identity Mesh architecture: connectors bring identities from each source system into the mesh, and export changes back out

Supported Connectors

Identity Mesh supports a wide range of identity providers and target systems through its connector framework.

Active Directory

LDAP

Connect to on-premises or cloud-hosted Active Directory

Microsoft Entra ID

Azure ADGroups write-back

Import 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 only

Import users and groups from the Okta identity platform (read-only today)

Workday

REST APIName/email write-back

Import workers from Workday HCM for HR-driven provisioning, and write corrected preferred names and work email addresses back

LDAP

LDAPComing Soon

Generic LDAP connector for any LDAP-compliant directory

SCIM 2.0

SCIMComing Soon

Standard SCIM 2.0 connector for any SCIM-compliant system

SQL Database

SQL

Direct database connector for custom identity stores

REST API

RESTComing Soon

Generic 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

LdapServer
Domain controller hostname or IP address
LdapPort
LDAP port. Omit (or 0) to pick 389 or 636 automatically from UseSsl
UseSsl
Enable LDAPS (recommended, and required for password writes)
BaseDn
Base distinguished name the import searches under
Partitions
Optional list of domains for a multi-domain forest, each with its own Id, 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.
ExternalIdAttribute
Attribute used as the stable external ID. Default: objectGUID
DeltaAttribute
Watermark attribute for delta imports. Default: uSNChanged
EnableAfterCreate
After creating a user, set the password and enable the account (userAccountControl 512). Requires UseSsl: true and a unicodePwd projection attribute rule with a GeneratePassword() transform. Default: false
DeleteMode
Connector-wide default for what a Delete export does. One of disable, disable-or-delete or delete; see Delete modes below. Each object type can override it. Default: disable

Object 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.

Name
The class's LDAP display name: 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.
Attributes
Attributes to load for this type. An empty or absent list means the connector's default attribute set, never "load nothing". The defaults include objectSid, which is imported as a string in the usual S-1-5-... form.
Filter
Optional LDAP clause that replaces this type's built-in clause only. Leave it null to use the default, for example (&(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.
Export.CreateEnabled
Whether exports may create objects of this type. When false, an Add fails with a message naming the type; updates and deletes are unaffected. Absent means true.
Export.DefaultContainer
OU used for a create whose projection rule carries no target container. It is never used to move an existing object. The Rules page shows the container a projection rule inherits from here.
Export.DeleteMode
Overrides the connector-wide 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, uSNChanged and objectClass.
  • • Each returned entry is typed from its objectClass, so a single search feeds every configured type.
  • • A domain's own Filter (on a Partitions entry) 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.

ModeBehaviour
disableDefault. 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-deleteDisables 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.
deleteRemoves 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, managedBy and secretary are 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.
  • • distinguishedName is 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.All
    Read all users' full profiles
  • Group.Read.All
    Read all groups
  • Directory.Read.All
    Read 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 datetime2 column for delta tracking (not date which 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

connectionString
SQL Server connection string. For Azure SQL with token auth, omit User ID/Password.
importQuery
SELECT query or table/view name (e.g., dbo.Employees)
externalIdColumn
Column used as the unique external identifier. Default: Id
deltaColumn (alias: watermarkColumn)
Column for watermark-based delta import. Must be datetime2, bigint, or rowversion. You can use either deltaColumn or watermarkColumn in the config JSON.
deltaColumnType
Type hint: datetime, long, bigint, rowversion, or binary. Default: datetime
softDeleteColumn (alias: isActiveColumn)
Column indicating soft-deleted rows. Optional. You can use isActiveColumn as an alias — when used, the semantics are inverted automatically (IsActive=0 means deleted).
softDeleteValue
Value that indicates deletion. For SQL bit columns, use 0 or 1. Default: true. When using isActiveColumn, this defaults to 0 automatically.
columnsToLoad
Array of column names to SELECT instead of *. 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=com

If 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

SqlAuth
SQL Server authentication with username and password (default)
Integrated
Windows Integrated Authentication using the service account
AzureADClientCredential
Entra ID service principal for Azure SQL Database (requires tenantId)
AzureManagedIdentity
Azure Managed Identity for Azure SQL Database
AzureDefault
Azure DefaultAzureCredential (tries managed identity, the Azure CLI sign-in, environment variables, and so on)

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.