In some scenarios, the requirement is to create the account only, without granting any real access in the target system. We don’t want to add a real dummy group on the target system.
Current Limitation
Currently, there is no way to create an account in a source without going through an access request.
To trigger account creation, an entitlement must be granted.
Common Workaround
Create a dummy entitlement that is granted to the user.
Even though it does not grant any real permissions, this entitlement still exists as a real entitlement, which is not always desirable from a governance or design perspective.
Proposed Solution
The proposed solution still uses an entitlement to trigger account creation, but:
The entitlement does not actually exist in the target system
It is used only as a technical trigger inside SailPoint
To achieve this, a second entitlement type is created, dedicated exclusively to account creation.
This entitlement will never be effectively granted in the target system.
How the Mechanism Works
A special entitlement is granted via an Access Profile
Note: In SailPoint ISC, roles and entitlements are sticky, meaning that if access is granted through ISC, it will be re-provisioned if removed from the target system. To allow the access to be removed after the next aggregation, you should use an Access Profile instead.
This entitlement triggers the account creation
During the first account aggregation:
The entitlement is not found on the account
The Access Profile is automatically removed from the identity
No reprovisioning loop occurs because:
Access Profiles do not enforce access
Unlike Roles or enforced entitlement requests
Implementation Steps
Create a new entitlement type Example:create_account
Reset the source using the VS Code plugin (optional)
This is only required if the new attribute was added to a running source. In some cases, this new attribute may not be recognized as an entitlement when you create and configure the Access Profile.
Create an HTTP operation for Group Aggregation-create_account
cURL:
curl --location --request GET 'https://postman-echo.com/get?id=fake_entitlement&description=fake_description'
Note: This postman-echo.com allows you to send data and receive the same data back, simulating an entitlement aggregation response.
Create an HTTP operation for Add Entitlement-create_account
cURL:
curl --location --request GET 'https://postman-echo.com/get?id=fake_entitlement&description=fake_description'
Note: This endpoint exists only to trigger the provisioning flow, and since it always returns a 200 response, the execution will be considered successful.
Thank you for sharing this interesting approach—it addresses a known limitation in ISC when the goal is to manage accounts (particularly account creation) without managing access.
I have a question regarding your entitlement aggregation simulation. You used the following request:
GET https://postman-echo.com/get?id=fake_entitlement&description=fake_description
In a restricted environment using a VA-based Webservice connector, where outbound communication to external URLs is limited or blocked, do you have any idea for simulating this entitlement aggregation?
That piece caught my eye as well. It creates a dependency on postman-echo. I would think that in your restricted environment, that it could still reach ISC, so curl --location --request GET ‘https://<tenantName>.identitynow.com’ would still get you a 200 response code. Then you would need to use a short after operation rule to set your entitlement name and id, since it won’t be in the response.
Thank you both for the feedback, these are very valid points.
I gave it some thought and there is indeed a cleaner and more self-contained approach that avoids any external dependency and eliminates the need for an after rule (especially if you want to work with a SaaS-based connector).
Alternative approach (no external endpoint required)
Instead of relying on an external service like Postman Echo, you can leverage ISC itself as the source of truth.
Steps
1. Create a dummy Role
Create a Role with the same name as the group you want to simulate
Populate the description field as needed
The role does not need to be enabled, it just needs to exist
this below logic may work as well. I am in early testing with it. It is a web services after operation rule to add a group entitlement as part of aggregating. Look for the values in the code " and replace it with your application name. Would just need to reference this rule on the afterrule parameter for the HTTP Operation.
@moises_proof Awesome post! Do you think a similar approach could be applied to the JDBC connector? We have a requirement to create accounts without provisioning actual entitlements on the target system.
JDBC could be easier since you have control of the query - just write a select to bring back the name of the dummy entitlement. Depending on the type of database, it could be something like:
We have a use case where we need to automatically create accounts based on specific conditions. For that, we planned to create a new role with define assignment criteria and associate a dummy entitlement of our web service source, which manages only accounts.
However, since this dummy entitlement is not consistently associated with the account, during the Identity Refresh will, ISC always try to add this dummy entitlement.
Do you have any suggestions on how to manage this?
Does your aggregation operation return the “dummy entitlement”?
What I’ve done with both JDBC and Web Services is include the “entitlement” in the account aggregation - if you have an account, then you have the entitlement. If you don’t have an account, then the role will trigger an add entitlement operation, which will create the account, then it will always have the entitlement. If the account needs to be disabled or deleted when the criteria is no longer met, then the remove entitlement operation needs to do the disable/delete work.
Hi, you need to rely on Access Profiles instead Entitlements for this use case.
A special entitlement is granted via an Access Profile
Note: In SailPoint ISC, roles and entitlements are sticky, meaning that if access is granted through ISC, it will be re-provisioned if removed from the target system. To allow the access to be removed after the next aggregation, you should use an Access Profile instead.
Thanks @moises_proof. Even if I rely on Access Profile and include it in a Role, once the Role is granted, ISC will always end up triggering the Entitlements during every Identity Refresh if the Entitlements included in the Access Profiles are not actually assigned to the accounts.
I finally ended up with the same solution: adding the entitlements during account aggregation.
I’m using the Web Services SaaS connector, and I already have a Customizer attached to my source for other use cases.
So I simply added these two commands:
.afterStdAccountList(async (context: Context, output: StdAccountListOutput) => {
logger.info(`Running after account list for account ${output.identity}`)
output.attributes.acces="acces_xxx_sailpoint"
return output
})
.afterStdAccountRead(async (context: Context, output: StdAccountReadOutput) => {
output.attributes.acces="acces_xxx_sailpoint"
return output
})
I added an access attribute (type Entitlement) to my account schema. During account aggregation, the access_xxx_sailpoint entitlement is automatically added to accounts and populated in the Entitlements tab, so I don’t perform a separate entitlement aggregation.
I create a Role and add entitlement access_xxx_sailpoint