SSO: ¿Azure AD idp + llamada de API externa de Apex?

Aug 26 2020

Pregunta:

  • Cuando un usuario inicia sesión en SF con el proveedor de identidad (SSO) de Azure AD, queremos enviar la identidad actual (en forma de una aserción Saml, un token de portador, etc.) junto con la solicitud de llamada de API externa, para autenticar la API. llamada. ¿Tiene algún consejo, orientación o sugerencia basada en su experiencia?

Antecedentes:

  • Hemos mirado https://www.pluralsight.com/courses/play-by-play-salesforce-understanding-single-sign-on
  • Hemos leído numerosos tutoriales y páginas de documentación en Salesforce, Azure y varios blogs.
  • Hemos implementado con éxito SSO con Azure AD (basado en SAML).
  • Estamos en el proceso de descubrir cómo configurar el proveedor de autenticación en Azure AD también, como otra opción de enfoque.
  • También estamos construyendo la API externa, la API podría aceptar información de autenticación basada en OpenID o SAML, nosotros tenemos el control. Estamos publicando datos en la llamada saliente a esta API externa (SF -> API).

Problemas:

  • El problema al que nos enfrentamos es tratar de averiguar cómo enviar la autenticación (ya sea la aserción Saml o el token Oauth de la sesión del usuario) junto con la solicitud de llamada de API externa.
  • No existe una documentación clara sobre cómo hacerlo o un código de ejemplo sobre cómo hacer esto.

Posibles enfoques que hemos hecho una lluvia de ideas / estamos explorando:

  1. Saml al usuario SSO en SF. Este es nuestro enfoque alternativo si ninguno de los siguientes funciona. Todo el código estaría en Apex. Utilizaríamos el flujo de "credenciales de cliente" para establecer una conexión de máquina a máquina entre SF y la API externa. Sin embargo, esto no usa las credenciales del usuario que inició sesión, por lo que realmente no está logrando el caso de uso de aprovechar la sesión que inició sesión del usuario actual (pista de auditoría de llamadas de API ...). ¿Pero tal vez sea la única forma en que podemos hacer que funcione la llamada externa?
  2. Saml al usuario SSO en SF. Entonces, ¿todas las llamadas externas de API ocurren en un componente web Lightning (LWC)? Aquí hay poco o ningún código Apex. Esto permitiría que el navegador y javascript manejen los redireccionamientos saml al invocar la API con una publicación. Esta opción es toda teoría en este punto y en realidad no sé cómo funcionaría y no puedo encontrar ningún código de muestra.
  3. Saml al usuario SSO en SF. Luego intercambie una aserción saml por un token oauth:https://feedback.azure.com/forums/169401-azure-active-directory/suggestions/19728688-support-for-oauth-2-0-saml-bearer-assertion-flowTodo el código estaría en Apex. No puedo encontrar ningún código de muestra que respalde este enfoque. Y ni siquiera estoy seguro de cómo acceder o construir una aserción Saml cuando estoy en código Apex.
  4. Enfoque de credencial con nombre. Podría usar Saml SSO o Azure AD Auth Provider (usando Open ID Connect) para iniciar sesión en SF. O tener ambos donde Saml maneja SSO y Auth Provider maneja API auth. ¿La credencial nombrada pasaría la información de autenticación a la API externa? Sé que puede hacer referencia a un proveedor de autenticación en la credencial con nombre, pero no puedo encontrar cómo configurar las credenciales con nombre solo con Saml SSO. ¿El código Apex haría referencia a la Credencial nombrada y "Simplemente funciona"? Sin embargo, no puedo encontrar código Apex de ejemplo, aparte de algo como esto. . . pero ¿cómo se establece la autenticación?
    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;

Respuestas

GXianDrive Aug 26 2020 at 04:31

¿Ha considerado utilizar un flujo de inicio de sesión personalizado? https://help.salesforce.com/articleView?id=security_login_flow_examples.htm&type=5

Esto se ejecutaría como parte del proceso de autenticación del usuario.

Puede usar una clase APEX en su flujo de inicio de sesión para llamar a su servicio web externo / punto final API.

Re: credencial con nombre en APEX, consulte el ff. enlace:https://help.salesforce.com/articleView?id=named_credentials_about.htm&type=5

DavidBrossard Sep 20 2020 at 00:09

No necesitas hacer nada personalizado. Si usa open ID connect, el proveedor de autenticación almacenará el token de acceso y el token de actualización en la plataforma para que cuando quiera llamar a su sistema de terceros, simplemente pueda usar Apex para recuperar esos tokens. Tenga en cuenta que la actualización del token también se gestiona por usted.

Dicho esto, esto solo se aplica si usa open ID connect para empezar

JoelHoward Oct 08 2020 at 01:24

Fuimos con SAML SSO, registro de la aplicación de Azure (al publicar la API), proveedor de autenticación en SF (para obtener un token para usar con la API) y Named Creds (para unir todo):

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