This card covers authentication methods across all three SAP S/4HANA deployment models: Public Cloud, Private Cloud (RISE with SAP), and on-premise. Authentication availability varies significantly between these models — Public Cloud is the most restrictive, on-premise the most flexible. SAP's identity strategy is actively shifting from XSUAA to SAP IAS with AMS. [src6]
| Property | Value |
|---|---|
| Vendor | SAP |
| System | SAP S/4HANA 2025 / Cloud 2H 2025 |
| API Surface | OData v2/v4, SOAP, RFC/BAPI |
| Current Release | 2025 FPS01 (Private Cloud), 2H 2025 (Public Cloud) |
| Editions Covered | Public Cloud, Private Cloud (RISE), On-Premise |
| Deployment | Cloud / On-Premise / Hybrid |
| API Docs | SAP API Business Hub |
| Status | GA |
SAP S/4HANA exposes APIs through multiple surfaces. Each surface supports different authentication methods depending on the deployment model.
| API Surface | Protocol | Auth Methods (Cloud) | Auth Methods (On-Prem) | Primary Use |
|---|---|---|---|---|
| OData v2/v4 | HTTPS/JSON+XML | OAuth 2.0, mTLS, Basic (deprecated) | Basic, X.509, OAuth 2.0, Kerberos | Standard API integration |
| SOAP | HTTPS/XML | OAuth 2.0, mTLS, Basic (deprecated) | Basic, X.509, Kerberos | Legacy integration, IDocs |
| RFC/BAPI | SNC/TCP | N/A (not exposed in Public Cloud) | SNC (X.509, Kerberos) | SAP-to-SAP, SAP GUI |
| SAP GUI | DIAG/SNC | N/A | Kerberos/SPNEGO, X.509/SNC, SAML | Interactive user access |
| Fiori/UI5 | HTTPS | SAML 2.0, IAS | SAML 2.0, Kerberos/SPNEGO | Browser-based UI access |
System-to-system integration where no user context is needed. The calling system authenticates with its own client ID and client secret (or client certificate) to obtain an access token. [src1]
| Property | Value |
|---|---|
| Grant Type | client_credentials |
| User Context | None — runs as technical communication user |
| Token Lifetime | Configurable; default 12 hours (S/4HANA Cloud) |
| Refresh Token | Not applicable — request new token when expired |
| Deployment | Public Cloud, Private Cloud, On-Premise (via XSUAA/IAS) |
| Security Level | Standard (with client secret) / High (with client certificate) |
When to use: Scheduled batch jobs, middleware-to-S/4HANA integrations, monitoring scripts, data migration tools. [src3, src4]
Propagates a named user's identity from an external system through to S/4HANA. The calling system presents a signed SAML assertion to the OAuth token endpoint, which validates it and issues an access token scoped to the asserted user. [src7]
| Property | Value |
|---|---|
| Grant Type | urn:ietf:params:oauth:grant-type:saml2-bearer |
| User Context | Yes — access token is scoped to the propagated user |
| Token Lifetime | Configurable; default 12 hours |
| Refresh Token | Not supported |
| Deployment | Public Cloud, Private Cloud |
| Security Level | High — requires trust relationship + signed SAML assertion |
When to use: BTP extension apps calling back to S/4HANA on behalf of the logged-in user, Fiori launchpad integrations, any scenario requiring user-level authorization enforcement. [src1, src7]
Mutual TLS provides the strongest authentication by requiring the client to present a valid X.509 certificate during the TLS handshake. S/4HANA Cloud comes with a ready-to-use client default certificate. [src2]
| Property | Value |
|---|---|
| Protocol | TLS 1.2+ with client certificate |
| User Context | Technical communication user (mapped to certificate subject) |
| Session | Per-request — no token to manage |
| Deployment | All — Public Cloud, Private Cloud, On-Premise |
| Security Level | Highest — no credentials transmitted over the wire |
| Certificate Requirements | CA-signed (Cloud); CA-signed or self-signed (On-Premise) |
Cloud-specific requirement: S/4HANA Cloud Public Edition does not accept self-signed X.509 certificates. Your certificate must be signed by a Certificate Authority known to the S/4HANA Cloud backend. [src2]
Basic Authentication transmits base64-encoded credentials in the HTTP Authorization header. Deprecated for S/4HANA Cloud Public Edition — use only for development/testing. [src1, src4]
| Property | Value |
|---|---|
| Protocol | HTTP Basic (RFC 7617) |
| Deployment | On-Premise (supported), Private Cloud (limited), Public Cloud (deprecated) |
| Security Level | Low — credentials in every request |
| SAP Status | Deprecated for S/4HANA Cloud Public Edition (2024+) |
SAML 2.0 is used for browser-based single sign-on to SAP Fiori, Web GUI, and other web applications. Not used for API authentication directly but critical for interactive user access. [src4]
| Property | Value |
|---|---|
| Protocol | SAML 2.0 (HTTP POST binding) |
| Deployment | All deployment models |
| IdP Support | SAP IAS, Microsoft Entra ID (Azure AD), Okta, PingFederate, ADFS |
Kerberos with SPNEGO provides transparent SSO for Windows domain users accessing SAP GUI and web applications via Secure Network Communications. [src5]
| Property | Value |
|---|---|
| Protocol | Kerberos 5 / SPNEGO over SNC |
| Deployment | On-Premise only, Private Cloud (limited with Cloud Connector) |
| Requires | Active Directory, SAP Secure Login Server, SNC configuration |
| Not Available | S/4HANA Cloud Public Edition |
| Auth Method | Public Cloud | Private Cloud | On-Premise | User Context | Security Level |
|---|---|---|---|---|---|
| OAuth 2.0 Client Credentials | Yes | Yes | Yes (with XSUAA/IAS) | No | Standard/High |
| OAuth 2.0 SAML Bearer | Yes | Yes | Possible (with BTP) | Yes | High |
| X.509 / mTLS | Yes | Yes | Yes (SNC) | No | Highest |
| Basic Auth | Deprecated | Limited | Yes | Varies | Low |
| SAML 2.0 (Browser SSO) | Yes | Yes | Yes | Yes | High |
| Kerberos/SPNEGO | No | Limited | Yes | Yes | High |
Authentication itself is not rate-limited in SAP S/4HANA, but fair-use throttling applies to token endpoints and API calls.
| Limit Type | Value | Applies To | Notes |
|---|---|---|---|
| Token request rate | Fair use / not published | S/4HANA Cloud | Cache tokens — do not request per API call |
| Token lifetime | 12h default (configurable) | S/4HANA Cloud | Configured in communication arrangement |
| Certificate validity | Max 2 years (Cloud) | S/4HANA Cloud mTLS | Plan certificate rotation before expiry |
| Limit Type | Value | Applies To | Notes |
|---|---|---|---|
| Max communication arrangements | No hard limit | S/4HANA Cloud | One per integration scenario per external system |
| Auth methods per arrangement | 1 primary | S/4HANA Cloud | Cannot mix OAuth and Basic in same arrangement |
| Communication users per system | Multiple allowed | S/4HANA Cloud | Each can have different auth methods |
[src1]
START — User needs to authenticate against SAP S/4HANA
+-- What deployment model?
| +-- Public Cloud
| | +-- System-to-system (no user context)?
| | | +-- Standard security -> OAuth 2.0 Client Credentials (client secret)
| | | +-- High security -> OAuth 2.0 Client Credentials (mTLS client auth)
| | | OR -> X.509 ClientCertificateAuthentication (direct mTLS)
| | +-- User context needed (principal propagation)?
| | | +-- OAuth 2.0 SAML Bearer Assertion
| | | (requires IdP trust: SAP IAS or third-party SAML IdP)
| | +-- Browser SSO?
| | +-- SAML 2.0 via SAP IAS (or federated third-party IdP)
| +-- Private Cloud (RISE)
| | +-- Same as Public Cloud options, PLUS:
| | +-- Cloud Connector available?
| | | +-- YES -> Principal propagation via Cloud Connector
| | | +-- NO -> OAuth 2.0 flows only
| | +-- Kerberos needed?
| | +-- Possible via Cloud Connector + on-premise AD (complex)
| +-- On-Premise
| +-- SAP GUI access?
| | +-- Windows domain users -> Kerberos/SPNEGO via SNC
| | +-- External users -> X.509 certificates via SNC
| | +-- Legacy -> Basic Auth (plan migration)
| +-- API access (OData/SOAP)?
| | +-- Standard -> Basic Auth (still supported on-prem)
| | +-- Modern -> OAuth 2.0 via XSUAA/IAS on BTP
| | +-- High security -> X.509 / mTLS
| +-- Browser SSO (Fiori)?
| +-- Internal users -> Kerberos/SPNEGO
| +-- External users -> SAML 2.0
+-- What security level?
+-- Standard -> OAuth 2.0 Client Credentials with client secret
+-- High -> OAuth 2.0 with mTLS client auth, or direct mTLS
+-- Enterprise -> SAML federation + principal propagation
| Scenario | Recommended Auth | Deployment | Setup Complexity | Notes |
|---|---|---|---|---|
| Middleware reads S/4HANA data (batch) | OAuth 2.0 Client Credentials | All Cloud | Low | Communication arrangement + OAuth client |
| BTP app calls S/4HANA as logged-in user | OAuth 2.0 SAML Bearer | Public/Private Cloud | Medium | Requires IAS trust + destination config |
| iPaaS platform (MuleSoft, Workato) | OAuth 2.0 Client Credentials | All Cloud | Low | Most iPaaS platforms support this natively |
| SAP-to-SAP (CPI/Integration Suite) | OAuth 2.0 Client Credentials | Private Cloud | Low-Medium | Pre-configured in Integration Suite |
| Regulated industry (banking, pharma) | X.509 / mTLS | All | Medium-High | CA-signed cert required on Cloud |
| On-prem SAP GUI transparent SSO | Kerberos/SPNEGO + SNC | On-Premise | High | Requires AD + SAP Secure Login Server |
| Fiori browser SSO | SAML 2.0 | All | Medium | IAS (Cloud) or SAML2 transaction (on-prem) |
| Legacy third-party integration | Basic Auth | On-Premise only | Low | Deprecated on Cloud — plan migration |
| DevOps / CI-CD pipeline | OAuth 2.0 Client Credentials | All Cloud | Low | Token caching essential |
| Webhook / event receiver | OAuth 2.0 Client Credentials | All Cloud | Low | S/4HANA outbound to external system |
Create a communication arrangement in S/4HANA Cloud that exposes the required API services and generates OAuth credentials. [src1]
Step 1: In S/4HANA Cloud, go to "Communication Arrangements" (Fiori app)
Step 2: Click "New" -> select the Communication Scenario (e.g., SAP_COM_0008 for Business Partner)
Step 3: Create or assign a Communication System (represents the external caller)
Step 4: Create a Communication User:
- Authentication Method: OAuth 2.0
- Grant Type: Client Credentials
- Download or note the Client ID and Client Secret
Step 5: Save the arrangement -- note the Token Endpoint URL:
https://{tenant}.s4hana.cloud.sap/sap/bc/sec/oauth2/token
Verify: Request a token using the credentials:
curl -X POST "https://{tenant}.s4hana.cloud.sap/sap/bc/sec/oauth2/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-u "{client_id}:{client_secret}" \
-d "grant_type=client_credentials"
Verify: Response contains "access_token" and "token_type": "bearer". [src1, src3]
Include the bearer token in the Authorization header of your API request. [src4]
curl -X GET "https://{tenant}.s4hana.cloud.sap/sap/opu/odata/sap/API_BUSINESS_PARTNER/A_BusinessPartner?$top=10" \
-H "Authorization: Bearer {access_token}" \
-H "Accept: application/json"
Verify: HTTP 200 with d.results array containing business partner data.
For highest-security environments, configure certificate-based authentication. [src2]
Step 1: Obtain a CA-signed X.509 client certificate (PEM or PKCS#12 format)
-- SAP Cloud provides a "client default certificate" you can use directly
Step 2: In "Communication Arrangements", create/edit the arrangement
Step 3: For the Communication User, select Authentication Method: "SSL Client Certificate"
Step 4: Upload the client certificate's public key to the Communication User
Step 5: Map the certificate's Subject DN to the communication user
Step 6: Save -- the system now accepts mTLS connections using this certificate
Verify:
curl -X GET "https://{tenant}.s4hana.cloud.sap/sap/opu/odata/sap/API_BUSINESS_PARTNER/A_BusinessPartner?$top=5" \
--cert client-cert.pem \
--key client-key.pem \
-H "Accept: application/json"
Verify: HTTP 200 — certificate accepted and user mapped correctly. [src2]
Set up SAML-based single sign-on for Fiori and web application access. [src1]
For S/4HANA Cloud (Public/Private):
Step 1: Configure SAP IAS as the Identity Provider
Step 2: In S/4HANA Cloud admin, navigate to "Trust Configuration"
Step 3: Download the S/4HANA SAML metadata (Service Provider metadata)
Step 4: Upload SP metadata to your IdP (SAP IAS, Entra ID, Okta, etc.)
Step 5: Upload IdP metadata to S/4HANA Cloud trust configuration
Step 6: Map IdP user attributes to S/4HANA business user attributes
For On-Premise:
Step 1: Run transaction SAML2 to configure S/4HANA as SAML Service Provider
Step 2: Exchange metadata with your IdP
Step 3: Configure name ID mapping and attribute assertions
Step 4: Enable SAML authentication in ICF service nodes
Verify: Access Fiori launchpad URL in browser — should redirect to IdP login, then return authenticated. [src1]
# Input: S/4HANA Cloud tenant URL, OAuth client ID and secret
# Output: Business Partner data as JSON
import requests # requests==2.31.0
TENANT_URL = "https://{tenant}.s4hana.cloud.sap"
TOKEN_URL = f"{TENANT_URL}/sap/bc/sec/oauth2/token"
CLIENT_ID = "your_client_id"
CLIENT_SECRET = "your_client_secret"
# Step 1: Obtain access token
token_response = requests.post(
TOKEN_URL,
auth=(CLIENT_ID, CLIENT_SECRET),
data={"grant_type": "client_credentials"},
headers={"Content-Type": "application/x-www-form-urlencoded"},
)
token_response.raise_for_status()
access_token = token_response.json()["access_token"]
# Step 2: Call OData API with bearer token
api_url = f"{TENANT_URL}/sap/opu/odata/sap/API_BUSINESS_PARTNER/A_BusinessPartner"
api_response = requests.get(
api_url,
headers={
"Authorization": f"Bearer {access_token}",
"Accept": "application/json",
},
params={"$top": 10, "$select": "BusinessPartner,BusinessPartnerFullName"},
)
api_response.raise_for_status()
partners = api_response.json()["d"]["results"]
for bp in partners:
print(f"{bp['BusinessPartner']}: {bp['BusinessPartnerFullName']}")
# Input: S/4HANA Cloud tenant URL, client certificate and key files (PEM)
# Output: Business Partner data as JSON -- no OAuth token exchange needed
import requests # requests==2.31.0
TENANT_URL = "https://{tenant}.s4hana.cloud.sap"
CERT_FILE = "client-cert.pem" # CA-signed X.509 certificate
KEY_FILE = "client-key.pem" # Private key
api_url = f"{TENANT_URL}/sap/opu/odata/sap/API_BUSINESS_PARTNER/A_BusinessPartner"
response = requests.get(
api_url,
cert=(CERT_FILE, KEY_FILE), # mTLS: client presents certificate
headers={"Accept": "application/json"},
params={"$top": 5},
)
response.raise_for_status()
print(response.json()["d"]["results"])
# Input: Client ID, Client Secret, Token endpoint URL
# Output: JSON with access_token, token_type, expires_in
curl -s -X POST "https://{tenant}.s4hana.cloud.sap/sap/bc/sec/oauth2/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-u "{client_id}:{client_secret}" \
-d "grant_type=client_credentials" | python -m json.tool
# Expected response shape:
# {
# "access_token": "eyJ...",
# "token_type": "bearer",
# "expires_in": 43200
# }
| Configuration Item | Public Cloud Location | Private Cloud Location | On-Premise Location |
|---|---|---|---|
| Communication Arrangement | Fiori: "Communication Arrangements" app | Fiori: "Communication Arrangements" app | N/A (use SM59 / SOAMANAGER) |
| OAuth Client Registration | Auto-generated in comm. arrangement | Auto-generated in comm. arrangement | Transaction SOAUTH2 or BTP XSUAA |
| X.509 Certificate Upload | Communication User settings | Communication User settings | Transaction STRUST (PSE management) |
| SAML Trust Configuration | Administration > Trust Configuration | Administration > Trust Configuration | Transaction SAML2 |
| Kerberos/SNC Config | N/A | Cloud Connector + SNC | Transaction RZ10 (profile params) + SU01 (SNC name) |
| IdP Metadata Exchange | SAP IAS admin console | SAP IAS admin console | Transaction SAML2 (metadata upload) |
p:[email protected] while X.509 SNC names use p:CN=Common Name, O=Org, C=Country. Mixing formats causes mapping failures. [src5]| HTTP Code / Error | Meaning | Cause | Resolution |
|---|---|---|---|
| 401 Unauthorized | Authentication failed | Invalid credentials, expired token, certificate not trusted | Verify credentials; check token expiry; ensure CA cert is in trust store |
| 403 Forbidden | Authenticated but not authorized | Communication user lacks authorization | Check communication arrangement scope; verify business catalog assignments |
| 400 Bad Request (OAuth) | Token request malformed | Wrong grant_type, missing parameters | Use application/x-www-form-urlencoded; verify grant_type string exactly |
| SSL Handshake Failure | mTLS certificate rejected | Self-signed cert on Cloud, expired cert | Use CA-signed cert on Cloud; verify cert chain; check expiry dates |
| SAML Assertion Invalid | SAML bearer token rejected | Assertion expired, signature verification failed | Check clock sync; verify signing cert in trust config; check SAML issuer ID |
| SNC Name Mismatch | Kerberos auth failed | SNC name in SU01 does not match Kerberos principal | Verify exact SNC name format and case in SU01; run SNC diagnostic trace |
Implement token refresh 5 minutes before expiry; add retry-on-401 logic that requests a fresh token and replays the failed request. [src3]Set calendar reminder 30 days before expiry; upload new cert while old is still valid; test with new cert before deactivating old. [src2]Implement naming conventions and documentation for all arrangements; use change management to prevent accidental deletion. [src1]Upload new IdP certificate to S/4HANA trust configuration before the IdP starts using it; keep old cert active during transition. [src7]Ensure NTP synchronization on all systems; check SAML assertion validity window (typically 5-10 minutes). [src7]# BAD -- hammers the token endpoint, may trigger throttling
for record in records:
token = get_new_oauth_token() # New token per request!
call_api(token, record)
# GOOD -- token cached, refreshed only when near expiry
import time
class TokenCache:
def __init__(self, client_id, client_secret, token_url):
self._token = None
self._expiry = 0
self._client_id = client_id
self._client_secret = client_secret
self._token_url = token_url
def get_token(self):
if self._token and time.time() < self._expiry - 300: # 5min buffer
return self._token
resp = requests.post(self._token_url,
auth=(self._client_id, self._client_secret),
data={"grant_type": "client_credentials"})
data = resp.json()
self._token = data["access_token"]
self._expiry = time.time() + data["expires_in"]
return self._token
# BAD -- Basic Auth is deprecated on S/4HANA Cloud Public Edition
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
# GOOD -- OAuth 2.0 is the standard for S/4HANA Cloud
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
# BAD -- secrets in code are visible in version control
CLIENT_SECRET = "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
# GOOD -- secrets from environment or vault
import os
CLIENT_SECRET = os.environ["SAP_OAUTH_CLIENT_SECRET"]
# Or use a secrets manager (AWS Secrets Manager, Azure Key Vault, HashiCorp Vault)
Configure BTP Destination service with S/4HANA token endpoint, client ID, and client secret; set "Authentication" to "OAuth2ClientCredentials" or "OAuth2SAMLBearerAssertion". [src6]Verify the communication scenario includes the needed OData/SOAP services; check that the communication user's assigned system has the right scope. [src1]For new applications, use SAP IAS from the start. For existing apps, plan migration using hybrid authentication mode (accepts both XSUAA and IAS tokens). [src6]Export the full certificate chain (client cert + intermediate CAs) in PEM format and upload all certificates. [src2]# Test OAuth 2.0 token endpoint (Client Credentials)
curl -v -X POST "https://{tenant}.s4hana.cloud.sap/sap/bc/sec/oauth2/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-u "{client_id}:{client_secret}" \
-d "grant_type=client_credentials"
# Expected: HTTP 200 with access_token in JSON body
# If 401: client_id or client_secret is wrong
# If 400: grant_type or Content-Type is wrong
# Test mTLS certificate authentication
curl -v --cert client-cert.pem --key client-key.pem \
"https://{tenant}.s4hana.cloud.sap/sap/opu/odata/sap/API_BUSINESS_PARTNER/$metadata"
# Expected: HTTP 200 with OData metadata XML
# If SSL handshake error: certificate not trusted (check CA chain)
# Verify OAuth token validity (decode JWT)
echo "{access_token}" | cut -d. -f2 | base64 -d 2>/dev/null | python -m json.tool
# Check: "exp" (expiry timestamp), "client_id", "scope"
# Test S/4HANA Cloud API with bearer token
curl -s -o /dev/null -w "%{http_code}" \
-H "Authorization: Bearer {access_token}" \
"https://{tenant}.s4hana.cloud.sap/sap/opu/odata/sap/API_BUSINESS_PARTNER/A_BusinessPartner?$top=1"
# Expected: 200
# If 401: token expired or invalid
# If 403: communication user lacks authorization for this service
| S/4HANA Version | Release | Auth Changes | Migration Notes |
|---|---|---|---|
| 2H 2025 (Cloud) | 2025-10 | OAuth Authorization Code with PKCE (RFC 7636) added; JWT-based client auth (RFC 7523) | New options for BTP integration; existing flows unaffected |
| 2025 FPS01 (Private Cloud) | 2025-08 | SAP-managed client certificates for Private Cloud | Simplifies mTLS setup for RISE customers |
| 2H 2024 (Cloud) | 2024-10 | Basic Auth formally deprecated for inbound APIs | Migrate to OAuth or mTLS; existing Basic Auth still works but unsupported |
| 2023 (On-Premise) | 2023-10 | No breaking changes | OAuth available via BTP; native auth methods unchanged |
SAP follows a two-release deprecation notice policy for S/4HANA Cloud. Authentication method changes are announced at least one release (6 months) before enforcement. On-premise customers have longer migration windows. Basic Auth deprecation was announced in 2024 with no hard enforcement date yet. [src1]
| Use When | Don't Use When | Use Instead |
|---|---|---|
| System-to-system batch integration (no user context) | You need user-level audit trail in S/4HANA | OAuth 2.0 SAML Bearer Assertion (principal propagation) |
| S/4HANA Cloud Public Edition new integration | On-premise S/4HANA with existing Basic Auth | Basic Auth (on-prem only, plan migration) |
| Regulated industry requiring certificate-based auth | Simple dev/test environment | OAuth 2.0 Client Credentials (simpler setup) |
| Browser SSO for Fiori applications | API-to-API integration (no browser) | OAuth 2.0 Client Credentials or mTLS |
| Windows domain users accessing SAP GUI (on-prem) | Cloud deployment without Active Directory | SAML 2.0 browser SSO |
| Capability | SAP S/4HANA Cloud | Oracle ERP Cloud | Salesforce | Microsoft Dynamics 365 |
|---|---|---|---|---|
| OAuth 2.0 | Client Credentials + SAML Bearer | Client Credentials + JWT Bearer | JWT Bearer + Web Server + Client Credentials | Client Credentials + Auth Code |
| Certificate Auth (mTLS) | Yes (CA-signed required) | Yes | Yes (connected app) | Yes (certificate-based) |
| Basic Auth | Deprecated (Cloud) | Not recommended | Not available (Cloud) | Supported |
| SAML SSO | SAML 2.0 via IAS | SAML 2.0 via OCI IAM | SAML 2.0 | SAML 2.0 via Entra ID |
| Kerberos/SPNEGO | On-premise only | Not applicable | Not applicable | Via Entra ID |
| API Key | Not supported | Not supported | Not supported (use OAuth) | Not supported |
| Token Lifetime | 12h default (configurable) | 1h (configurable) | 2h (session-based) | 1h default |
| IdP Flexibility | SAP IAS, any SAML 2.0 IdP | OCI IAM, any SAML 2.0 IdP | Any SAML/OIDC IdP | Entra ID (native), any SAML IdP |