Autenticación y autorización en Azure App Service y Azure Functions

Azure App Service incluye funcionalidades de autenticación y autorización integradas (lo que a veces se denomina "Easy Auth") para que pueda proporcionar inicio de sesión a los usuarios y acceder a los datos escribiendo una cantidad mínima de código (o directamente sin código) en la aplicación web, API RESTful y back-end móvil, así como Azure Functions. En este artículo se describe cómo App Service le ayuda a simplificar la autenticación y autorización para la aplicación.

¿Por qué usar la autenticación integrada?

No es necesario usar esta característica para la autenticación y autorización. Puede usar las características de seguridad agrupadas en el marco de trabajo web de su elección o puede escribir sus propias utilidades. Sin embargo, deberá asegurarse de que la solución se mantiene actualizada con las actualizaciones más recientes del explorador, el protocolo y la seguridad.

La implementación de una solución segura para la autenticación (que permite el inicio de sesión de los usuarios) y la autorización (que proporciona acceso a los datos seguros) puede suponer un esfuerzo considerable. Debe asegurarse de seguir los procedimientos recomendados y los estándares del sector, así como mantener la implementación actualizada. La característica de autenticación integrada para App Service y Azure Functions puede ahorrar tiempo y esfuerzo, ya que proporciona autenticación integrada con proveedores de identidades federados, lo que le permite centrarse en el resto de la aplicación.

  • Azure App Service le permite integrar numerosas funcionalidades de autenticación en su aplicación web o API sin implementarlas usted mismo.
  • Está integrado directamente en la plataforma y no requiere ningún idioma, SDK, experiencia en seguridad ni ningún código en particular.
  • Puede integrar con varios proveedores de inicio de sesión. Por ejemplo, Azure AD, Facebook, Google y Twitter.

Proveedores de identidades

App Service usa la identidad federada, en la cual un proveedor de identidades de terceros almacena las identidades de usuario y el flujo de autenticación para usted. De forma predeterminada, están disponibles los siguientes proveedores de identidades:

Proveedor Punto de conexión de inicio de sesión Guía de procedimientos
Plataforma de identidad de Microsoft /.auth/login/aad Inicio de sesión con la Plataforma de identidad de Microsoft para App Service
Facebook /.auth/login/facebook Inicio de sesión con Facebook para App Service
Google /.auth/login/google Inicio de sesión con Google para App Service
Twitter /.auth/login/twitter Inicio de sesión con Twitter para App Service
GitHub /.auth/login/github Inicio de sesión de GitHub de App Service
Inicio de sesión con Apple /.auth/login/apple Inicio de sesión de App Service con el inicio de sesión de Apple (versión preliminar)
Nuevo proveedor de OpenID Connect /.auth/login/<providerName> Inicio de sesión con OpenID Connect para App Service

Cuando habilita la autenticación y autorización con uno de estos proveedores, su punto de conexión de inicio de sesión está disponible para la autenticación de usuarios y para la validación de tokens de autenticación del proveedor. Se puede proporcionar a los usuarios cualquier número de estas opciones de inicio de sesión.

Consideraciones sobre el uso de la autenticación integrada

La habilitación de esta característica hará que todas las solicitudes a la aplicación se redirijan automáticamente a HTTPS, con independencia del valor de configuración de App Service para aplicar HTTPS. Puede deshabilitarlo con la configuración de requireHttps en la configuración de V2. Sin embargo, recomendamos seguir con HTTPS, y debe asegurarse de que ningún token de seguridad se transmita a través de conexiones HTTP no seguras.

App Service puede usarse para la autenticación con o sin restringir el acceso al contenido del sitio y a las API. Para restringir el acceso a la aplicación solo a los usuarios autenticados, establezca Acción necesaria cuando la solicitud no está autenticada para iniciar sesión con uno de los proveedores de identidades configurados. Para autenticar pero no restringir el acceso, establezca Acción necesaria cuando la solicitud no está autenticada en "Permitir solicitudes anónimas (ninguna acción)".

Nota

Debe otorgar al registro de cada aplicación su propio permiso y consentimiento. Evite el uso compartido de permisos entre entornos mediante registros de aplicación independientes para ranuras de implementación independientes. Al probar nuevo código, esta práctica puede ayudar a evitar que los problemas afecten a la aplicación de producción.

Funcionamiento

Arquitectura de características

Flujo de autenticación

Comportamiento de la autorización

Almacén de tokens

Registro y seguimiento

Arquitectura de características

El componente de middleware de autenticación y autorización es una característica de la plataforma que se ejecuta en la misma máquina virtual que la aplicación. Cuando está habilitado, cada solicitud HTTP entrante pasa por él antes de que la aplicación lo controle.

Diagrama de arquitectura que muestra las solicitudes que intercepta un proceso en el espacio aislado del sitio que interactúa con los proveedores de identidades antes de permitir el tráfico al sitio implementado

El middleware de plataforma controla varios aspectos de la aplicación:

  • Autentica usuarios y clientes con los proveedores de identidades especificados.
  • Valida, almacena y actualiza los tokens de OAuth emitidos por los proveedores de identidades configurados.
  • Administra la sesión autenticada
  • Inserta información de identidad en encabezados de solicitud HTTP.

El módulo se ejecuta por separado del código de la aplicación y se puede configurar mediante Azure Resource Manager o mediante un archivo de configuración. No se necesitan SDK, lenguajes de programación específicos ni cambios en el código de la aplicación.

Arquitectura de características en Windows (implementación sin contenedor)

El módulo de autenticación y autorización se ejecuta como módulo de IIS nativo en el mismo espacio aislado que la aplicación. Cuando está habilitado, cada solicitud HTTP entrante pasa por él antes de que la aplicación lo controle.

Arquitectura de características en Linux y contenedores

El módulo de autenticación y autorización se ejecuta en un contenedor independiente, aislado del código de la aplicación. Con lo que se conoce como patrón de embajador, interactúa con el tráfico entrante para realizar una funcionalidad similar a la de Windows. Dado que no se ejecuta en proceso, no es posible la integración directa con marcos de lenguaje específicos. Sin embargo, la información pertinente que necesita su aplicación se pasa con encabezados de solicitud, como se explica a continuación.

Flujo de autenticación

El flujo de autenticación es el mismo para todos los proveedores, pero varía en función de si desea iniciar sesión con el SDK del proveedor:

  • Sin el SDK del proveedor: la aplicación delega el inicio de sesión federado a App Service. Por lo general, suele ser el caso de las aplicaciones de explorador, que pueden presentar la página de inicio de sesión del proveedor al usuario. El código del servidor administra el proceso de inicio de sesión, por lo que también se denomina flujo dirigido por el servidor o flujo de servidor. Este caso se aplica a aplicaciones de explorador y aplicaciones móviles que usan un explorador incrustado para la autenticación.
  • Con el SDK del proveedor: la aplicación inicia manualmente la sesión del usuario con el proveedor y luego envía el token de autenticación a App Service para su validación. Por lo general, suele ser el caso de las aplicaciones sin explorador, que no pueden presentar la página de inicio de sesión del proveedor al usuario. El código de aplicación administra el proceso de inicio de sesión, por lo que también se denomina flujo dirigido por el cliente o flujo de cliente. Este caso se aplica a las API REST, Azure Functions y los clientes de explorador de JavaScript, así como a las aplicaciones de explorador que necesitan más flexibilidad en el proceso de inicio de sesión. También se aplica a las aplicaciones móviles nativas que proporciona inicio de sesión a los usuarios con el SDK del proveedor.

Las llamadas desde una aplicación de explorador de confianza en App Service a otra REST API de App Service o Azure Functions se pueden autenticar mediante el flujo dirigido por el servidor. Para obtener más información, vea Personalización del inicio y cierre de sesión.

En la tabla siguiente se muestran los pasos del flujo de autenticación.

Paso Sin el SDK del proveedor Con el SDK del proveedor
1. Inicio de sesión del usuario Redirige el cliente a /.auth/login/<provider>. El código de cliente proporciona inicio de sesión al usuario directamente con el SDK del proveedor y recibe un token de autenticación. Para información, consulte la documentación del proveedor.
2. Autenticación posterior El proveedor redirige el cliente a /.auth/login/<provider>/callback. El código de cliente publica el token del proveedor en /.auth/login/<provider> para la validación.
3. Establecer la sesión autenticada App Service agrega una cookie autenticada a la respuesta. App Service devuelve su propio token de autenticación al código de cliente.
4. Servir contenido autenticado El cliente incluye la cookie de autenticación en las solicitudes posteriores (controladas automáticamente por explorador). El código de cliente presenta el token de autenticación en el encabezado X-ZUMO-AUTH.

Para los exploradores del cliente, App Service puede dirigir automáticamente todos los usuarios no autenticados a /.auth/login/<provider>. También se pueden presentar a los usuarios uno o varios vínculos /.auth/login/<provider> para iniciar sesión en la aplicación con sus proveedores preferidos.

Comportamiento de la autorización

En Azure Portal, puede configurar App Service con varios comportamientos cuando la solicitud entrante no esté autenticada. Los encabezados siguientes describen las opciones.

Permitir solicitudes no autenticadas

Esta opción traslada la autorización del tráfico sin autenticar al código de aplicación. Para las solicitudes autenticadas, App Service también transfiere información de autenticación en los encabezados HTTP.

Esta opción proporciona más flexibilidad a la hora de controlar las solicitudes anónimas. Por ejemplo, le permite presentar varios proveedores de inicio de sesión a los usuarios. Sin embargo, debe escribir código.

Requerir autenticación

Esta opción rechazará el tráfico no autenticado hacia la aplicación. Este rechazo puede ser una acción de redireccionamiento a uno de los proveedores de identidades configurados. En estos casos, un cliente del explorador se redirige a /.auth/login/<provider> para el proveedor que elija. Si la solicitud anónima procede de una aplicación móvil nativa, la respuesta devuelta es HTTP 401 Unauthorized. También puede configurar el rechazo para que sea HTTP 401 Unauthorized o HTTP 403 Forbidden para todas las solicitudes.

Con esta opción, no es necesario escribir ningún código de autenticación en la aplicación. Una autorización más precisa, como la autorización específica de rol, se puede controlarse mediante la inspección de las notificaciones del usuario (consulte Access user claims (Acceso a las notificaciones de usuario)).

Precaución

Este método de restricción del acceso se aplica a todas las llamadas a la aplicación, lo que puede no ser deseable para las aplicaciones que necesitan una página de inicio disponible públicamente, como muchas aplicaciones de una sola página.

Nota

De forma predeterminada, cualquier usuario del inquilino de Azure AD puede solicitar un token para la aplicación desde Azure AD. Puede configurar la aplicación en Azure AD si desea restringir el acceso a la aplicación a un conjunto definido de usuarios.

Almacén de tokens

App Service proporciona un almacén de tokens integrado, que es un repositorio de tokens que están asociados a los usuarios de las aplicaciones web, API o aplicaciones móviles nativas. Al habilitar la autenticación con cualquier proveedor, este almacén de tokens pasa a estar inmediatamente disponible para la aplicación, si el código de aplicación necesita acceder a los datos de estos proveedores en nombre del usuario, como:

  • publicar en la escala de tiempo de Facebook del usuario autenticado
  • leer los datos corporativos del usuario mediante Microsoft Graph API

Normalmente, debe escribir código para recopilar, almacenar y actualizar estos tokens en la aplicación. Con el almacén de tokens, simplemente recupera los tokens cuando los necesita e indica a App Service que los actualice cuando dejan de ser válidos.

Los tokens de identificador, los tokens de acceso y los tokens de actualización se almacenaron en caché durante la sesión autenticada y solamente el usuario asociado puede acceder a ellos.

Si no necesita trabajar con tokens en la aplicación, puede deshabilitar el almacén de tokens en la página Autenticación/Autorización de la aplicación.

Registro y seguimiento

Si habilita el registro de aplicaciones, verá los seguimientos de autenticación y autorización directamente en los archivos de registro. Si ve un error de autenticación que no esperaba, puede encontrar cómodamente todos los detalles examinando los registros de aplicaciones existentes. Si habilita el seguimiento de solicitudes erróneas, puede ver exactamente qué rol puede haber desempeñado el módulo de autenticación y autorización en una solicitud errónea. En los registros de seguimiento, busque las referencias a un módulo denominado EasyAuthModule_32/64.

Consideraciones al usar Azure Front Door

Al usar Azure App Service con Easy Auth detrás de Azure Front Door u otros servidores proxy inversos, es necesario tener en cuenta algunos aspectos adicionales.

  1. Deshabilitación del almacenamiento en caché para el flujo de trabajo de autenticación

    Consulte Deshabilitación de la caché para el flujo de trabajo de autenticación para más información sobre cómo configurar reglas en Azure Front Door para deshabilitar el almacenamiento en caché para las páginas relacionadas con la autenticación y la autorización.

  2. Uso del punto de conexión de Front Door para redireccionamientos

    App Service normalmente no es accesible directamente cuando se expone a través de Azure Front Door. Esto se puede evitar, por ejemplo, al exponer App Service a través de Private Link en Azure Front Door Premium. Para evitar que el flujo de trabajo de autenticación redirija el tráfico de nuevo a App Service directamente, es importante configurar la aplicación para volver a redirigir a https://<front-door-endpoint>/.auth/login/<provider>/callback.

  3. Asegúrese de que App Service usa el URI de redirección correcto.

    En algunas configuraciones, App Service usa el FQDN de App Service como el URI de redireccionamiento en lugar del FQDN de Front Door. Esto provocará un problema cuando el cliente se redirige a App Service en lugar de Front Door. Para cambiarlo, la configuración forwardProxy debe establecerse en Standard para que App Service respete el encabezado X-Forwarded-Host establecido por Azure Front Door.

    Otros servidores proxy inversos, como Azure Application Gateway o productos de terceros, pueden usar encabezados diferentes y necesitan una configuración forwardProxy diferente.

    Esta configuración no se puede realizar mediante Azure Portal y debe realizarse a través de az rest:

    Exportar configuración

    az rest --uri /subscriptions/REPLACE-ME-SUBSCRIPTIONID/resourceGroups/REPLACE-ME-RESOURCEGROUP/providers/Microsoft.Web/sites/REPLACE-ME-APPNAME/config/authsettingsV2?api-version=2020-09-01 --method get > auth.json

    Actualización de la configuración

    Buscar

    "httpSettings": {
      "forwardProxy": {
        "convention": "Standard"
      }
    }
    

    y asegúrese de que convention está establecido en Standard para respetar el encabezado X-Forwarded-Host usado por Azure Front Door.

    Importar configuración

    az rest --uri /subscriptions/REPLACE-ME-SUBSCRIPTIONID/resourceGroups/REPLACE-ME-RESOURCEGROUP/providers/Microsoft.Web/sites/REPLACE-ME-APPNAME/config/authsettingsV2?api-version=2020-09-01 --method put --body @auth.json

Más recursos

Ejemplos: