SSO: Azure AD IDP + externes API-Callout von Apex?
Frage:
- Wenn ein Benutzer mit Azure AD Identity Provider (SSO) bei SF angemeldet ist, möchten wir die aktuelle Identität (in Form einer Saml-Zusicherung, eines Bearer-Tokens usw.?) Zusammen mit der externen API-Callout-Anforderung senden, um die API zu authentifizieren Anruf. Haben Sie Ratschläge, Anleitungen oder Tipps, die auf Ihren Erfahrungen basieren?
Hintergrund:
- Wir haben zugesehen https://www.pluralsight.com/courses/play-by-play-salesforce-understanding-single-sign-on
- Wir haben zahlreiche, zahlreiche Tutorials und Dokumentationsseiten in Salesforce, Azure und verschiedenen Blogs gelesen.
- Wir haben SSO erfolgreich mit Azure AD (SAML-basiert) implementiert.
- Wir sind gerade dabei herauszufinden, wie der Auth Provider für Azure AD als weitere Ansatzoption eingerichtet werden kann.
- Wir erstellen auch die externe API - die API könnte OpenID- oder SAML-basierte Authentifizierungsinformationen akzeptieren - wir haben die Kontrolle. Wir veröffentlichen Daten im ausgehenden Callout an diese externe API (SF -> API).
Probleme:
- Das Problem besteht darin, herauszufinden, wie die Authentifizierung (entweder Saml-Assertion oder Oauth-Token aus der Benutzersitzung) zusammen mit der externen API-Callout-Anforderung gesendet wird.
- Es gibt keine eindeutige Dokumentation oder einen Beispielcode dazu.
Mögliche Ansätze, die wir uns überlegt haben / die wir untersuchen:
- Saml an SSO-Benutzer in SF. Dies ist unser Fallback-Ansatz, wenn keiner der anderen unten funktioniert. Der gesamte Code wäre in Apex. Wir würden den Fluss "Client-Anmeldeinformationen" verwenden, um eine Maschine-zu-Maschine-Verbindung zwischen SF und der externen API herzustellen. Dies verwendet jedoch nicht die Anmeldeinformationen des angemeldeten Benutzers, sodass der Anwendungsfall der Nutzung der angemeldeten Sitzung des aktuellen Benutzers (API-Aufruf-Audit-Trail ..) nicht wirklich erreicht wird. Aber vielleicht ist es die einzige Möglichkeit, das externe Callout zum Laufen zu bringen?
- Saml an SSO-Benutzer in SF. Dann finden alle externen API-Aufrufe in einer Lightning Web Component (LWC) statt? Hier gibt es wenig oder keinen Apex-Code. Dies würde es dem Browser und Javascript ermöglichen, Saml-Weiterleitungen zu verarbeiten, wenn die API mit einem Beitrag aufgerufen wird. Diese Option ist derzeit alles Theorie und ich weiß nicht, wie es funktionieren würde und ich kann keinen Beispielcode finden.
- Saml an SSO-Benutzer in SF. Tauschen Sie dann eine saml-Behauptung gegen ein oauth-Token aus:https://feedback.azure.com/forums/169401-azure-active-directory/suggestions/19728688-support-for-oauth-2-0-saml-bearer-assertion-flowDer Code wäre alle in Apex. Ich kann keinen Beispielcode finden, der diesen Ansatz unterstützt. Und ich bin mir nicht einmal sicher, wie ich im Apex-Code auf eine Saml-Assertion zugreifen oder diese erstellen soll.
- Benannter Anmeldeinformationsansatz. Kann entweder Saml SSO oder Azure AD Auth Provider (mit Open ID Connect) verwenden, um Benutzer bei SF anzumelden. Oder haben Sie beide, wo Saml SSO und Auth Provider API-Auth behandelt. Der benannte Berechtigungsnachweis würde die Authentifizierungsinformationen an die externe API übergeben. Ich weiß, dass Sie in den benannten Anmeldeinformationen auf einen Auth-Anbieter verweisen können, aber ich kann nicht finden, wie benannte Anmeldeinformationen nur mit Saml SSO konfiguriert werden. Apex-Code würde auf den benannten Berechtigungsnachweis verweisen und "Just work"? Ich kann jedoch keinen Beispiel-Apex-Code finden, außer so etwas. . . aber wie wird auth eingestellt?
Http http = new Http();
HttpRequest request = new HttpRequest();
request.setEndpoint('callout:MY_API_URL/');
request.setMethod('POST');
request.setHeader('Content-Type', 'application/json;charset=UTF-8');
request.setBody(JSON.serialize(orderPayload));
HttpResponse response = http.send(request);
return response;
Antworten
Haben Sie überlegt, einen benutzerdefinierten Anmeldefluss zu verwenden? https://help.salesforce.com/articleView?id=security_login_flow_examples.htm&type=5
Dies würde als Teil des Benutzerauthentifizierungsprozesses ausgeführt.
Sie können eine APEX-Klasse in Ihrem Anmeldefluss verwenden, um Ihren externen Webdienst / API-Endpunkt aufzurufen.
Betreff: benannter Berechtigungsnachweis in APEX, siehe ff. Verknüpfung:https://help.salesforce.com/articleView?id=named_credentials_about.htm&type=5
Sie müssen nichts Benutzerdefiniertes tun. Wenn Sie Open ID Connect verwenden, speichert der Authentifizierungsanbieter das Zugriffstoken und das Aktualisierungstoken auf der Plattform für Sie, sodass Sie diese Token einfach mit Apex abrufen können, wenn Sie Ihr Drittanbieter-System anrufen möchten. Beachten Sie, dass die Aktualisierung des Tokens auch für Sie erledigt wird.
Dies gilt jedoch nur, wenn Sie zunächst Open ID Connect verwenden
Wir haben uns für SAML SSO, Azure App-Registrierung (beim Veröffentlichen der API), Auth Provider in SF (um Token für die Verwendung mit API zu erhalten) und Named Creds (um alles zusammenzubinden) entschieden:
https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app
https://help.salesforce.com/articleView?id=sso_provider_microsoft.htm&type=5