From 65d77ed4bb13ef94f09fe1a0f638d1a4da25fb5d Mon Sep 17 00:00:00 2001 From: Gregor Wolf Date: Sat, 16 Mar 2024 22:10:30 +0100 Subject: [PATCH] Azure API Management Policies --- .../oauth-client-credentials-policy.xml | 61 ++++ .../oauth-saml-bearer-assertion-policy.xml | 322 ++++++++++++++++++ 2 files changed, 383 insertions(+) create mode 100644 azure-api-management/oauth-client-credentials-policy.xml create mode 100644 azure-api-management/oauth-saml-bearer-assertion-policy.xml diff --git a/azure-api-management/oauth-client-credentials-policy.xml b/azure-api-management/oauth-client-credentials-policy.xml new file mode 100644 index 0000000..4ca1290 --- /dev/null +++ b/azure-api-management/oauth-client-credentials-policy.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + {{authorizationServer}} + POST + + application/x-www-form-urlencoded + + @{ + return + "client_id={{clientId}}&client_secret={{clientSecret}}&grant_type=client_credentials"; + } + + ())" /> + + + + + + + @("Bearer " + (string)context.Variables["bearerToken"]) + + + + + + + + + + + + + + + + + + + diff --git a/azure-api-management/oauth-saml-bearer-assertion-policy.xml b/azure-api-management/oauth-saml-bearer-assertion-policy.xml new file mode 100644 index 0000000..32a7e9a --- /dev/null +++ b/azure-api-management/oauth-saml-bearer-assertion-policy.xml @@ -0,0 +1,322 @@ + + + + + + + + + + + + + + + + + + + + api://{{APIMAADRegisteredAppClientId}} + + + https://sts.windows.net/{{AADTenantId}}/ + + + + SAPGraph.access + + + + + + + + + + + + + + + + + + + https://login.microsoftonline.com/{{AADTenantId}}/oauth2/v2.0/token + POST + + application/x-www-form-urlencoded + + @{ + var _AADRegisteredAppClientId = context.Variables["APIMAADRegisteredAppClientId"]; + var _AADRegisteredAppClientSecret = + context.Variables["APIMAADRegisteredAppClientSecret"]; + var _AADSAPResource = context.Variables["AADSAPResource"]; + var assertion = + context.Request.Headers.GetValueOrDefault("Authorization","").Replace("Bearer ",""); + return + $"grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion={assertion}&client_id={_AADRegisteredAppClientId}&client_secret={_AADRegisteredAppClientSecret}&scope={_AADSAPResource}/.default&requested_token_use=on_behalf_of&requested_token_type=urn:ietf:params:oauth:token-type:saml2"; + } + + ()[" access_token"])" /> + + + + https://{{SAPOAuthServerAdressForTokenEndpoint}}/oauth/token/alias/csw-dev.aws-live-eu10 + POST + + application/x-www-form-urlencoded + + + + @{ + var _SAPOAuthClientID = context.Variables["SAPOAuthClientID"]; + var _SAPOAuthClientSecret = context.Variables["SAPOAuthClientSecret"]; + return "Basic " + + Convert.ToBase64String(Encoding.UTF8.GetBytes($"{_SAPOAuthClientID}:{_SAPOAuthClientSecret}")); + } + + + + @{ + var assertion2 = context.Variables["accessToken"]; + return + $"grant_type=urn:ietf:params:oauth:grant-type:saml2-bearer&assertion={assertion2}"; + } + + + ())" /> + + + + + + + + + + + + + + + + + + https://{{SAPOAuthServerAdressForTokenEndpoint}}/oauth/token/alias/csw-dev.aws-live-eu10 + POST + + application/x-www-form-urlencoded + + + + @{ + var _SAPOAuthClientID = context.Variables["SAPOAuthClientID"]; + var _SAPOAuthClientSecret = context.Variables["SAPOAuthClientSecret"]; + return "Basic " + + Convert.ToBase64String(Encoding.UTF8.GetBytes($"{_SAPOAuthClientID}:{_SAPOAuthClientSecret}")); + } + + @{ + var _SAPOAuthClientID = context.Variables["SAPOAuthClientID"]; + var _SAPOAuthScope = context.Variables["SAPOAuthScope"]; + var _refreshToken = context.Variables["SAPRefreshToken"]; + return $"grant_type=refresh_token&refresh_token={_refreshToken}"; + } + + + ())" /> + + + + + + + + + + + + + + + + + + + + + @(context.Request.Url.ToString()) + HEAD + + Fetch + + + @("Bearer " + (string)context.Variables["SAPBearerToken"]) + + + + + + + + @(((IResponse)context.Variables["SAPCSRFToken"]).Headers.GetValueOrDefault("x-csrf-token")) + + + @{ + string rawcookie = + ((IResponse)context.Variables["SAPCSRFToken"]).Headers.GetValueOrDefault("Set-Cookie"); + string[] cookies = rawcookie.Split(';'); + /* new session sends a XSRF cookie */ + string xsrftoken = cookies.FirstOrDefault( ss => ss.Contains("sap-XSRF")); + /* existing sessions sends a SessionID. No other cases anticipated at this point. + Please create a GitHub Pull-Request if you encounter uncovered settings. */ + if(xsrftoken == null){ + xsrftoken = cookies.FirstOrDefault( ss => ss.Contains("SAP_SESSIONID")); + } + + return xsrftoken.Split(',')[1];} + + + + + + + @("Bearer " + (string)context.Variables["SAPBearerToken"]) + + + + + + + + json + + + + + + + + + + + + + + + + @(context.LastError.Source) + + + @(context.LastError.Reason) + + + @(context.LastError.Message) + + + @(context.LastError.Scope) + + + @(context.LastError.Section) + + + @(context.LastError.Path) + + + @(context.LastError.PolicyId) + + + @(context.Response.StatusCode.ToString()) + + +