Environment
-
Camunda 8 Operate self-managed (Docker), version 8.7.12
-
Identity enabled, IdP = Microsoft Entra ID (Azure AD)
-
Reverse proxy + TLS in front of the UIs
-
SPRING_PROFILES_ACTIVE=identity-auth
What I did
-
In Entra ID I created two app registrations:
-
Identity application.
-
Operate application (confidential client).
-
I added the Operate redirect URI:
https://<OPERATE_HOST>/identity-callback
-
-
In Identity, I added mapping rules for my user (by
oidand byazp) and granted the Operate role (and tested other roles too). -
Login flow works (I’m redirected to Microsoft, sign in, and get redirected back).
But after the callback, Operate shows/noPermission. -
Identity is reachable and healthy. In the browser,
GET https://<IDENTITY_HOST>/api/rolesreturns the roles list. -
I tried both spring profiles
oidcandidentity-auth.identity-authis the only one that got me this far (even though I’ve seenoidcmentioned in parts of the docs).
Current (sanitized) Operate config
# Profiles / logs
SPRING_PROFILES_ACTIVE=identity-auth
LOGGING_LEVEL_ROOT=INFO
LOGGING_LEVEL_IO_CAMUNDA_OPERATE_WEBAPP_SECURITY_IDENTITY=DEBUG
LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_SECURITY=DEBUG
# Core wiring
CAMUNDA_OPERATE_ZEEBE_GATEWAYADDRESS=zeebe:26500
CAMUNDA_OPERATE_ZEEBE_SECURE=false
CAMUNDA_OPERATE_ELASTICSEARCH_URL=http://elasticsearch:9200
CAMUNDA_OPERATE_ZEEBEELASTICSEARCH_URL=http://elasticsearch:9200
CAMUNDA_OPERATE_MULTITENANCY_ENABLED=false
CAMUNDA_OPERATE_IDENTITY_RESOURCEPERMISSIONSENABLED=false
CAMUNDA_OPERATE_IDENTITY_REDIRECT_ROOT_URL=https://<OPERATE_HOST>
SERVER_FORWARD_HEADERS_STRATEGY=FRAMEWORK
# Identity / Entra (sanitized)
CAMUNDA_OPERATE_IDENTITY_BASEURL=https://<IDENTITY_HOST>
CAMUNDA_OPERATE_IDENTITY_CLIENTID=<OPERATE_APP_ID>
CAMUNDA_OPERATE_IDENTITY_CLIENTSECRET=<SECRET>
# I have tried both of these values for audience over different attempts:
# - api://<IDENTITY_APP_ID>
# - <OPERATE_APP_ID>
CAMUNDA_OPERATE_IDENTITY_AUDIENCE=api://<IDENTITY_APP_ID>
# Issuer and explicit Azure v2 endpoints
CAMUNDA_OPERATE_IDENTITY_ISSUER_URL=https://login.microsoftonline.com/<TENANT_ID>/v2.0
CAMUNDA_OPERATE_IDENTITY_ISSUER_BACKEND_URL=https://login.microsoftonline.com/<TENANT_ID>/v2.0
CAMUNDA_OPERATE_IDENTITY_AUTHORIZATION_URL=https://login.microsoftonline.com/<TENANT_ID>/oauth2/v2.0/authorize
CAMUNDA_OPERATE_IDENTITY_TOKEN_URL=https://login.microsoftonline.com/<TENANT_ID>/oauth2/v2.0/token
Symptoms / logs
-
Operate logs show the typical lines:
-
Try to access protected resource /operate. Save it for later redirect -
IdentityController - Called back by identity with /identity-callback code=...
-
-
No stack trace now; I simply land on
/noPermissionin the UI.
Token notes (sanitized)
A decoded user token (authorization_code) during testing includes:
{
"iss": "https://login.microsoftonline.com/<TENANT_ID>/v2.0",
"aud": "<IDENTITY_APP_ID or api://<IDENTITY_APP_ID>>",
"azp": "<OPERATE_APP_ID>",
"oid": "<MY_USER_OID>"
}
I also created Identity mapping rules for my user (by oid) and for the azp client, assigning Operate (and other product) roles.
What I’ve already tried
-
Swapping
AUDIENCEbetween the Identity app ID and the Operate app ID. -
Confirmed the Operate redirect URI matches the Entra registration.
-
Verified that Identity endpoints are reachable; mapping rules are visible.
Questions
-
What is the minimal, exact set of env vars to wire Operate → Identity → Entra ID on Docker Compose for Camunda 8.7?
-
For
CAMUNDA_OPERATE_IDENTITY_AUDIENCE, should this be the Identity app ID (e.g.api://<IDENTITY_APP_ID>) or the Operate app ID? -
After the callback, does Operate expect the user’s JWT to already contain an
Operaterole claim? Or does Operate call Identity’s API (e.g./api/me) to resolve roles — and if so, what scope/role must the user token have to call that successfully? -
Is
identity-auththe correct profile for this scenario (Operate behind Identity with Entra as IdP)? Any doc that shows a complete example with Entra? -
Given that I’m consistently landing on
/noPermissioneven though Identity mapping rules grant my user the Operate role: what else could be missing (tenants? additional claims? different audience)?
Any guidance or a known-good Compose snippet for Entra ID would be greatly appreciated!