| name | btp-cloud-identity |
| description | SAP Cloud Identity Services — IAS (authentication), IPS (provisioning), AMS (authorization), XSUAA migration, corporate IdP federation. |
SAP Cloud Identity Services — IAS / IPS / AMS
1. Download IAS Tenant Metadata
curl -s https://<tenant>.accounts.ondemand.com/saml2/metadata -o ias-metadata.xml
curl -s https://<tenant>.accounts.ondemand.com/.well-known/openid-configuration | jq .
2. Configure Corporate IdP Federation (IAS)
In Corporate IdP (Azure AD / Okta / Keycloak):
- Create Enterprise Application (SAML)
- Upload
ias-metadata.xml as Service Provider metadata
- Configure nameID format as
emailAddress
- Export corporate IdP SAML metadata XML
In IAS Admin Console (https://<tenant>.accounts.ondemand.com/admin):
- Navigate to Applications → select your BTP subaccount app
- Trust → Corporate Identity Provider → Add
- Upload corporate IdP metadata XML
- Configure conditional authentication:
- Corporate IP range → password only
- External → password + TOTP (Microsoft/Google Authenticator)
- Save and enable
3. Configure IPS — User Provisioning
In IPS Admin Console (https://<tenant>.accounts.ondemand.com/ips):
- Source Systems → Add → select type (e.g. SAP SuccessFactors, Azure AD)
- Configure source connection properties (URL, credentials)
- Target Systems → Add → select type (e.g. SAP BTP XSUAA, S/4HANA)
- Configure target connection properties
- Mapping → define attribute mappings:
userName → userName
emails[0].value → emails[0].value
groups → groups
- Jobs → Create → select source + target → Run
4. Manage Users via SCIM 2.0 API
curl -X POST https://<tenant>.accounts.ondemand.com/service/scim/Users \
-H "Content-Type: application/scim+json" \
-H "Authorization: Bearer <token>" \
-d '{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
"userName": "john.doe@corp.com",
"name": { "givenName": "John", "familyName": "Doe" },
"emails": [{ "value": "john.doe@corp.com", "primary": true }],
"active": true
}'
curl "https://<tenant>.accounts.ondemand.com/service/scim/Users?filter=userName+eq+%22john.doe%22" \
-H "Authorization: Bearer <token>"
curl -X DELETE \
"https://<tenant>.accounts.ondemand.com/service/scim/Users/<user-id>" \
-H "Authorization: Bearer <token>"
5. XSUAA → IAS Migration
6. Shadow User Cleanup
curl "https://<tenant>.accounts.ondemand.com/service/scim/Users?filter=active+eq+true" \
-H "Authorization: Bearer <token>" | jq '.Resources[] | .userName'
Verification
curl -s https://<tenant>.accounts.ondemand.com/saml2/metadata | head -5
curl -s https://<tenant>.accounts.ondemand.com/.well-known/openid-configuration | jq .issuer
curl -s https://<tenant>.accounts.ondemand.com/service/scim/Users \
-H "Authorization: Bearer <token>" | jq '.totalResults'
Pitfalls
-
Shadow user orphans after IdP deletion
- Cause: Deleting a user in corporate IdP does not remove the shadow user in XSUAA.
- Solution: Configure IPS cleanup job to run daily. Job deactivates users not present in source system.
-
SAML certificate expiry breaks SSO
- Cause: Signing certificates expire every 1-2 years. No automatic alert by default.
- Solution: Monitor expiry date in IAS Admin Console → Settings → Certificates. Rotate 30 days before expiry and update corporate IdP trust.
-
IPS job frequency limit
- Cause: IPS minimum sync interval is 5 minutes. Sub-minute syncs are not supported.
- Solution: Use real-time SCIM API for immediate user creation instead of batch jobs.
-
Attribute mapping case mismatch
- Cause: SCIM/OpenID attribute names are case-sensitive.
givenName ≠ givenname.
- Solution: Use exact casing from SCIM 2.0 RFC. Test with
curl before enabling the mapping in production.
-
XSUAA → IAS migration is one-way
- Cause: Once BTP subaccount trust is switched to IAS, reverting requires manual trust reconfiguration.
- Solution: Keep XSUAA local IdP active for 30-day rollback window. Test with pilot users before full cutover.
-
IAS tenant URL format confusion
- Cause: Different URLs for admin console vs SCIM API vs SAML metadata.
- Solution: Admin =
https://<tenant>.accounts.ondemand.com/admin. SCIM = https://<tenant>.accounts.ondemand.com/service/scim. SAML metadata = https://<tenant>.accounts.ondemand.com/saml2/metadata.
-
MFA not triggered for external access
- Cause: Conditional authentication rules not applied, or corporate IP range too broad.
- Solution: Verify IP ranges in IAS → Applications → Conditional Authentication. Use CIDR notation (e.g.
10.0.0.0/8).