var/log/vmware/vc-ws1a-broker/federation-service.log:
yyyy-mm-ddThh:mm:ss WARN <vCenter_name>:federation (ForkJoinPool-2-worker-89) [CUSTOMER;-;10.XXX.XX.XX;e99c9789-1c20-4f5f-9166-XXXXXXXXXXX;-;472ee5fc-bc73-4141-9275-XXXXXXXXXXX] com.vmware.vidm.federation.login.processor.AuthResponseUserResolver - User fetching exception with nameId 00u1s8vrd1dKSs#####, nameIdFormat ExternalId, and domains [domain.com], user not found
yyyy-mm-ddThh:mm:ss INFO <vCenter_name>:federation (federation-business-pool-0) [CUSTOMER;-;10.XXX.XX.XX;e99c9789-1c20-4f5f-9166-XXXXXXXXXXX;-;472ee5fc-bc73-4141-9275-XXXXXXXXXXX] com.vmware.vidm.federation.login.LoginEventServiceAspect - Failing login. contextUuid: 472ee5fc-bc73-4141-9275-XXXXXXXXXXX, exception: com.vmware.vidm.federation.login.AccessDeniedException: Access denied with reason code: USER_NOT_FOUND, isAuthenticationForced: false
yyyy-mm-ddThh:mm:ss INFO <vCenter_name>:federation (federation-business-pool-0) [CUSTOMER;-;10.XXX.XX.XX;e99c9789-1c20-4f5f-9166-XXXXXXXXXXX;-;472ee5fc-bc73-4141-9275-XXXXXXXXXXX] com.vmware.vidm.federation.utils.MetricsPublisherUtil - Login failed due to reason: USER_NOT_FOUND
yyyy-mm-ddThh:mm:ss INFO <vCenter_name>:federation (federation-business-pool-0) [CUSTOMER;-;10.XXX.XX.XX;e99c9789-1c20-4f5f-9166-XXXXXXXXXXX;-;472ee5fc-bc73-4141-9275-XXXXXXXXXXX] com.vmware.vidm.federation.exception.handler.LoginExceptionHandler - Access denied for login context: 472ee5fc-bc73-4141-9275-XXXXXXXXXXX
VMware vCenter Server 8.x
Okta OIDC Identity Provider
This is a token claim mismatch between the Okta payload and the vCenter user directory.
vCenter primarily uses the OIDC sub (subject) claim as the immutable identifier to map the authenticated user to the SCIM-provisioned account. There is no supported UI in vCenter 8 U3 to configure an arbitrary custom claim (such as externalId) for this mapping.
When Okta hands the user off to vCenter after a successful authentication, it sends a specific nameId claim in the OIDC token. Okta is sending its internal system string (00u1s8vrd1dKSs73z1d8) as the ExternalId rather than a standard username. Because the user account synchronized into the vCenter database does not possess this exact alphanumeric string mapped to its profile, vCenter cannot link the authentication token to a known local user entity and denies the login.
externalId.sub, NameID, or another unique identifier).externalId.If these values differ, vCenter cannot associate the authenticated user with the existing account.
For example:
| SCIM-created user | OIDC token |
|---|---|
externalId = 00u1s8vrd1dKSs##### | sub = john.doe@example.com |
| Result: No match | Login or account mapping fails |
Test your authorization server configuration - https://help.okta.com/oie/en-us/content/topics/security/api-config-test.htm
To resolve this, you must align the identity payload Okta sends with the identity structure vCenter expects. You can achieve this using one of the following methods:
Option 1: SCIM Provisioning Alignment (Based on your deployment architecture), you have to check with OKTA support on this. (Not feasible when configuring for large number of users)
If you are dynamically populating vCenter users via a SCIM REST API script, the JSON payload that creates the user in vCenter must explicitly include the Okta NameID.
You must update your SCIM provisioning script to ensure the externalId field perfectly matches the Okta user ID (e.g., 00u1s8vrd1dKSs#####) so vCenter can map the incoming OIDC token to the SCIM-created account.
Option 2: Instead of modifying the SCIM provisioning process to write a different externalId, you can configure the Authorization Manager (or IdP) to send the identifier that vCenter expects.
If you are using a custom SCIM integration in Okta:
externalId.Option 3: (Check with OKTA support on this)
The Authorization Manager is acting as a centralized Identity Provider for many applications, each relying on the existing claim format. Changing a claim such as sub or NameID globally could break authentication or user mapping for those other applications.
So changing the IdP output was not an acceptable option.
We can use an on-premises provisioning agent with a proxy/transformation layer.
The proxy intercepted or transformed the provisioning data so that the externalId stored in vCenter matched the identifier that the Authorization Manager was already sending.
Refer: https://help.okta.com/en-us/content/topics/provisioning/opp/opp-architecture.htm
Similar issue on vCenter 9.x - Okta OIDC Login in vCenter 9.x Fails with Access Denied User Not Found
Similar issue on Azure AD in vCenter 8.x - Login to vCenter Server with Entra ID user fails with USER_NOT_FOUND