A cloud-based identity and access management service for securing user authentication and resource access
The described behavior aligns with current limitations and known behaviors of Microsoft Entra’s SCIM provisioning implementation rather than issues that can be fully remediated by configuration alone.
Key points from documented behavior:
- Roles provisioning and complex attributes
- Roles are provisioned using complex, multivalued attributes and special expressions such as
AppRoleAssignmentsComplexandAssertiveAppRoleAssignmentsComplex. - Custom complex and multivalued attributes are supported, but there are limits: flowing data to complex attributes with three or more subattributes is not supported, and Microsoft Entra ID does not have many complex data structures to pull data from in these cases.
- For roles, documentation explicitly recommends using
AppRoleAssignmentsComplexorAssertiveAppRoleAssignmentsComplexexpressions to map Entra app role assignments into SCIM roles, rather than arbitrary custom filter-path mappings onroles[type eq "..."]....
- Roles are provisioned using complex, multivalued attributes and special expressions such as
-
idvsvalueand role identity- For SCIM roles,
idis not required;valuecan be used as the role identifier. - A feature flag is available to adjust behavior around the
idattribute for roles, but documentation notes that relying solely onvalueis not always sufficient when multiple roles share the same name/identifier. In some cases,idmust be used.
- For SCIM roles,
- SCIM PATCH behavior and type handling
- Microsoft Entra’s SCIM implementation historically had non‑compliant PATCH behavior and introduced a feature flag (
aadOptscim062020) to make PATCH requests more SCIM‑compliant (e.g., correct casing ofop, boolean vs string values, and multi‑attribute replace/remove behavior). - The flag affects:
- Requests made to disable users (
activeboolean handling) - Requests to add a single‑value string attribute
- Requests to replace multiple attributes
- Requests to remove a group member
- Requests made to disable users (
- This behavior change is currently only available when using the flag and does not work with on‑demand provisioning.
- Microsoft Entra’s SCIM implementation historically had non‑compliant PATCH behavior and introduced a feature flag (
- Entra as SCIM client and requirements
- The provisioning service is designed to support SCIM 2.0, but the SCIM compliance article documents that there are known issues and flags to alter behavior.
- For multivalued complex attributes, the
typesubattribute values must be unique, and custom complex attributes are constrained.
How this maps to the three reported issues:
- Constant mapped to
roles[type eq "role"].valueresulting in{}- The documentation does not describe or guarantee support for arbitrary constant mappings to filtered sub‑attribute paths on complex multivalued attributes like
roles[type eq "role"].value. - It instead documents supported patterns using
AppRoleAssignmentsComplex/AssertiveAppRoleAssignmentsComplexfor roles. - Given the stated limitations on complex attributes and the absence of documented support for this specific pattern, the behavior observed (empty object in
value) is consistent with an unsupported or partially supported mapping scenario.
- The documentation does not describe or guarantee support for arbitrary constant mappings to filtered sub‑attribute paths on complex multivalued attributes like
-
roles[primary eq "True"].typebeing overridden withWindowsAzureActiveDirectoryRole- The roles provisioning guidance focuses on mapping Entra app role assignments into SCIM roles and notes that Entra uses its own role constructs.
- The documentation does not describe a supported scenario where the
typesubattribute ofrolesis fully controlled by a constant mapping; instead, it emphasizes mapping Entra app roles via the provided complex expressions. - The observed
typevalueWindowsAzureActiveDirectoryRoleis consistent with Entra’s internal representation of app roles and is not contradicted by the documentation.
-
primarysent as string instead of boolean- The SCIM compliance article explicitly documents that a feature flag (
aadOptscim062020) changes PATCH behavior to be more SCIM‑compliant, including:- Using lowercase
opvalues - Using proper JSON types (e.g.,
activeas a boolean instead of a string)
- Using lowercase
- The examples show the difference for
active, but the same flag governs general PATCH compliance behavior. - The documentation also notes that this feature flag does not apply to on‑demand provisioning and that the new behavior will become the default over time.
- The SCIM compliance article explicitly documents that a feature flag (
Recommended path based on documented guidance:
- Use the supported roles expressions
- Configure roles provisioning using
AppRoleAssignmentsComplexorAssertiveAppRoleAssignmentsComplexas documented in the “Provisioning a role to a SCIM app” section, rather than custom constant mappings onroles[type eq ...]. - These expressions are the supported way to map Entra app roles into SCIM roles and are designed to handle complex role structures and PATCH semantics.
- Configure roles provisioning using
- Use the SCIM compliance feature flag
- Ensure the SCIM compliance flag (
aadOptscim062020) is applied to the SCIM tenant URL as documented under “Flags to alter the SCIM behavior”. - Be aware that this flag does not affect on‑demand provisioning and that behavior differences may persist there until the new behavior becomes the default.
- Ensure the SCIM compliance flag (
- Align SCIM endpoint implementation with Entra’s expectations
- Implement SCIM roles such that:
-
idis not required for roles ifvalueis sufficient, but supportidwhen needed. - Multivalued complex attributes (like
roles) enforce uniquetypevalues.
-
- Ensure the endpoint accepts PATCH requests in the form Entra sends (including
AppRoleAssignmentsComplex/AssertiveAppRoleAssignmentsComplexpayloads) and returns valid SCIM responses.
- Implement SCIM roles such that:
If the behavior persists when using AppRoleAssignmentsComplex or AssertiveAppRoleAssignmentsComplex with the SCIM compliance flag enabled, the next step is to capture the exact PATCH and GET traffic and open a support case so that the SCIM provisioning service team can investigate, as this goes beyond what is covered in the documented behavior.
References:
- Tutorial - Customize user provisioning attribute-mappings for SaaS applications in Microsoft Entra ID
- Tutorial: Develop and plan provisioning for a SCIM endpoint in Microsoft Entra ID
- Known issues and resolutions with SCIM 2.0 protocol compliance of the Microsoft Entra user provisioning service
- SCIM support in Microsoft Entra ID