Skip to content

CMI STS 2: Impersonifizierung

Aufgrund von Sicherheitsüberlegungen wurde ein Feature vom CMI STS 2, welches häufig von Schnittstellen verwendet wird, nicht im CMI STS 3 umgesetzt. Somit müssen Schnittstellen zuerst mit dem CMI STS 3 kompatibel gemacht werden, wenn sie den "Impersonation Grant" vom CMI STS 2 verwenden. Stattdessen können "Client Credentials" oder der "Delegation Grant" verwendet werden.

Dieses Kapitel beschreibt die Änderung, die erforderlich ist, um vom Impersonation Grant auf den Client Credentials Grant zu wechseln. Es gibt die Client-Library CMI.STS.Client, die die Migration vereinfacht.

Ausgangslage: CMI STS 2, Impersonifizierung, OAuth Grant Type "Non-Standard-Password-Flow"

Aktuell sendet eine Schnittstelle folgendes an den CMI STS 2. USERNAME ist der technischer Benutzer im CMI. Die Client ID server ist ein hart codierter Wert im CMI STS 2.

POST /identity/connect/token HTTP/1.1
Host: {STS_HOST}
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache

grant_type=password&scope=metatool&client_id=server&client_secret={SECRET}&username={USERNAME}&password={PASSWORT}&acr_values=tenant%3A{MANDANTEN ID}

Anpassung: CMI STS 3, OAuth Grant Type "Client Credentials"

Die CLIENT_ID wird durch die CMI STS 3 Konfiguration festgelegt. CLIENT_ID kann den Namen der Schnittstelle haben. Heisst die Schnittstelle ABC Sync, könnte die Client ID abcsync verwendet werden. Es muss kein Benutzer angegeben werden, dieser wird beim CMI STS 3 hinterlegt.

POST /identity/connect/token HTTP/1.1
Host: {STS_HOST}
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache

grant_type=client_credentials&scope=metatool&client_id={CLIENT_ID}&client_secret={SECRET}&scope=metatool

Beim CMI STS 3 wird für die Schnittstelle ein eigener Client konfiguriert:

{
    "ClientId": "{CLIENT_ID}",
    "AllowedGrantTypes": ["client_credentials"],
    "ProtocolType": "oidc",
    "AllowAccessTokensViaBrowser": false,
    "AllowOfflineAccess": true,
    "ClientSecrets": [
        {
            "value": "{Sha512 Hash des SECRETS}"
        }
    ],
    "ClientCredentialsBackendUser": {
        "username": "{USERNAME}",
        "password": "{Passwort des technischen CMI Benutzers}"
    },
    "AllowedScopes": ["metatool"]
}

Beispiel-Request:

curl --location --request POST 'https://localhost:44391/hauptmandant/identity/connect/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode 'scope=metatool' \
--data-urlencode 'client_id=abcsync' \
--data-urlencode 'client_secret=123'

Response (200 OK):

{
    "access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjIyRTIzRDY1RDNDQjExMkEzOUQ1OEM3RjI0NzhCNkRGQTE1OTBDRUUiLCJ0eXAiOiJKV1QiLCJ4NXQiOiJJdUk5WmRQTEVTbzUxWXhfSkhpMjM2RlpETzQifQ.eyJuYmYiOjE2MjYzNjIxMjYsImV4cCI6MTYyNjM2NTcyNiwiaXNzIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NDQzOTEvaGF1cHRtYW5kYW50L2lkZW50aXR5IiwiYXVkIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NDQzOTEvaGF1cHRtYW5kYW50L2lkZW50aXR5L3Jlc291cmNlcyIsImNsaWVudF9pZCI6ImVwbGFuIiwic3ViIjoiaGF1cHRtYW5kYW50JDI5M2ZiZDMwN2RkMjQ0ZTc4YTRjNmI2NDQwNDAyZTNlIiwiYXV0aF90aW1lIjoxNjI2MzYyMTI2LCJpZHAiOiJsb2NhbCIsInVzZXJfaWQiOiJnZXZlciIsImdpdmVubmFtZSI6IkhhbnMiLCJuYW1lIjoiZ2V2ZXIiLCJlbWFpbCI6ImVsaWEuc2Vpa3JpdHRAY21pYWcuY2giLCJuYW1laWRlbnRpZmllciI6IjI5M2ZiZDMwN2RkMjQ0ZTc4YTRjNmI2NDQwNDAyZTNlIiwidXNlcl9ndWlkIjoiMjkzZmJkMzA3ZGQyNDRlNzhhNGM2YjY0NDA0MDJlM2UiLCJmdWxsbmFtZSI6IkhhbnMgZ2V2ZXIiLCJhcGlfc2VydmVyIjoiaGF1cHRtYW5kYW50IiwidGVuYW50IjoiaGF1cHRtYW5kYW50Iiwic2Vzc2lvbl9ndWlkIjoiNTY3YzAyOTY2MDQ1NDUzYTk5YzJjMGJlODY2MDMxMDQiLCJqdGkiOiI4NTI4QUI4N0U3RTYxNUE1MkQ1MDk0NjY4MkMyRTREOCIsImlhdCI6MTYyNjM2MjEyNiwic2NvcGUiOlsibWV0YXRvb2wiXSwiYW1yIjpbImNtaV9idWlsdGluIl19.uuPjBRxLr8Mfq3fbQqTp2-zfHnYNDEJCs8h4ySu4tpJ4L34bdVvkNpoKYyNNu1Fi7bfVK1uU3Ne5L22ZU2I2rUZFguS47GVrQ0hDIaMVf5AnWLNcEcahbE-W5JaP4yk0A5JSgsECsjwtDbu28cBdzD-PvKowQYNqxmKOnBK1kyW3rPb-8Ju-H2v_XL1Z_RSev60Pe6KTzSQijpx-5lCRozCQc_JWM9mWRDqSt-D2PTEWO9zJD06kSu2_c9tVei8rZEESKypj7p-B2IbBaBc56S9IMXwiYQcNofMKnlNPDUPGakdaUqWpHEPD1RVdnH1EdSqSbuzWoWBnjTylJ8mAPw",
    "expires_in": 3600,
    "token_type": "Bearer",
    "scope": "metatool"
}