Uso avanzado de la autenticación y autorización en Azure App ServiceAdvanced usage of authentication and authorization in Azure App Service

En este artículo se muestra cómo personalizar la autenticación y autorización integradas en App Service y cómo administrar la identidad desde la aplicación.This article shows you how to customize the built-in authentication and authorization in App Service, and to manage identity from your application.

Para comenzar inmediatamente, consulte uno de los siguientes tutoriales:To get started quickly, see one of the following tutorials:

Uso de varios proveedores de inicio de sesiónUse multiple sign-in providers

La configuración del portal no ofrece una manera preparada para presentar varios proveedores de inicio de sesión a los usuarios (por ejemplo, Facebook y Twitter).The portal configuration doesn't offer a turn-key way to present multiple sign-in providers to your users (such as both Facebook and Twitter). Sin embargo, no es difícil agregar la funcionalidad a la aplicación.However, it isn't difficult to add the functionality to your app. A continuación se describen los pasos necesarios:The steps are outlined as follows:

Primero, en la página Autenticación / Autorización de Azure Portal, configure cada uno de los proveedores de identidades que desea habilitar.First, in the Authentication / Authorization page in the Azure portal, configure each of the identity provider you want to enable.

En Action to take when request is not authenticated (Acción necesaria cuando la solicitud no está autenticada), seleccione Allow Anonymous requests (no action) (Permitir solicitudes anónimas (sin acción)).In Action to take when request is not authenticated, select Allow Anonymous requests (no action).

En la página de inicio de sesión, en la barra de navegación o en cualquier otra ubicación de la aplicación, agregue un vínculo de inicio de sesión a cada uno de los proveedores que ha habilitado (/.auth/login/<provider>).In the sign-in page, or the navigation bar, or any other location of your app, add a sign-in link to each of the providers you enabled (/.auth/login/<provider>). Por ejemplo:For example:

<a href="/.auth/login/aad">Log in with Azure AD</a>
<a href="/.auth/login/microsoftaccount">Log in with Microsoft Account</a>
<a href="/.auth/login/facebook">Log in with Facebook</a>
<a href="/.auth/login/google">Log in with Google</a>
<a href="/.auth/login/twitter">Log in with Twitter</a>

Cuando el usuario haga clic en uno de los vínculos, la página de inicio de sesión correspondiente se abrirá para que el usuario inicie sesión.When the user clicks on one of the links, the respective sign-in page opens to sign in the user.

Para redirigir al usuario después del inicio de sesión a una dirección URL personalizada, use el parámetro de cadena de consulta post_login_redirect_url (que no debe confundirse con el URI de redireccionamiento den su configuración de proveedor de identidades).To redirect the user post-sign-in to a custom URL, use the post_login_redirect_url query string parameter (not to be confused with the Redirect URI in your identity provider configuration). Por ejemplo, para redirigir al usuario a /Home/Index después de iniciar sesión, utilice el siguiente código HTML:For example, to navigate the user to /Home/Index after sign-in, use the following HTML code:

<a href="/.auth/login/<provider>?post_login_redirect_url=/Home/Index">Log in</a>

Validar los tokens de los proveedoresValidate tokens from providers

En un inicio de sesión que dirige el cliente, la aplicación consigue de forma manual que el cliente inicie sesión en el proveedor y envía el token de autenticación a App Service para su validación (consulte el flujo de autenticación).In a client-directed sign-in, the application signs in the user to the provider manually and then submits the authentication token to App Service for validation (see Authentication flow). Esta validación en sí misma no le otorga acceso a los recursos de aplicación que quiere, pero una validación exitosa le dará un token de sesión que puede usar para obtener acceso a los recursos de la aplicación.This validation itself doesn't actually grant you access to the desired app resources, but a successful validation will give you a session token that you can use to access app resources.

Para validar el token del proveedor, la aplicación App Service debe configurarse primero con el proveedor que quiera usar.To validate the provider token, App Service app must first be configured with the desired provider. En el entorno de ejecución, después de recuperar el token de autenticación de su proveedor, publique el token en /.auth/login/<provider> para su validación.At runtime, after you retrieve the authentication token from your provider, post the token to /.auth/login/<provider> for validation. Por ejemplo:For example:

POST https://<appname>.azurewebsites.net/.auth/login/aad HTTP/1.1
Content-Type: application/json

{"id_token":"<token>","access_token":"<token>"}

El formato del token varía ligeramente según el proveedor.The token format varies slightly according to the provider. Consulte la tabla siguiente para más detalles:See the following table for details:

Valor del proveedorProvider value Necesario en el cuerpo de la solicitudRequired in request body ComentariosComments
aad {"access_token":"<access_token>"}
microsoftaccount {"access_token":"<token>"} La propiedad expires_in es opcional.The expires_in property is optional.
Al solicitar el token de los servicios Live, solicite siempre el ámbito wl.basic.When requesting the token from Live services, always request the wl.basic scope.
google {"id_token":"<id_token>"} La propiedad authorization_code es opcional.The authorization_code property is optional. Cuando se especifica, también puede ir acompañado opcionalmente por la propiedad redirect_uri.When specified, it can also optionally be accompanied by the redirect_uri property.
facebook {"access_token":"<user_access_token>"} Use un token de acceso de usuario válido de Facebook.Use a valid user access token from Facebook.
twitter {"access_token":"<access_token>", "access_token_secret":"<acces_token_secret>"}

Si el token del proveedor se valida correctamente, la API regresa con un elemento authenticationToken en el cuerpo de la respuesta, que es su token de sesión.If the provider token is validated successfully, the API returns with an authenticationToken in the response body, which is your session token.

{
    "authenticationToken": "...",
    "user": {
        "userId": "sid:..."
    }
}

Una vez que tenga este token de sesión, puede obtener acceso a los recursos de aplicación protegidos agregando el encabezado X-ZUMO-AUTH a sus solicitudes HTTP.Once you have this session token, you can access protected app resources by adding the X-ZUMO-AUTH header to your HTTP requests. Por ejemplo:For example:

GET https://<appname>.azurewebsites.net/api/products/1
X-ZUMO-AUTH: <authenticationToken_value>

Cierre de sesión de una sesiónSign out of a session

Los usuarios pueden iniciar un cierre de sesión mediante el envío de una solicitud GET al punto de conexión de la aplicación /.auth/logout.Users can initiate a sign-out by sending a GET request to the app's /.auth/logout endpoint. La solicitud GET hace lo siguiente:The GET request does the following:

  • Borra las cookies de autenticación de la sesión actual.Clears authentication cookies from the current session.
  • Elimina los tokens del usuario actual del almacén de tokens.Deletes the current user's tokens from the token store.
  • Para Azure Active Directory y Google, realiza un cierre de sesión del servidor en el proveedor de identidades.For Azure Active Directory and Google, performs a server-side sign-out on the identity provider.

A continuación, se muestra un vínculo de cierre de sesión simple en una página web:Here's a simple sign-out link in a webpage:

<a href="/.auth/logout">Sign out</a>

De forma predeterminada, un cierre de sesión correcto redirige el cliente a la dirección URL /.auth/logout/done.By default, a successful sign-out redirects the client to the URL /.auth/logout/done. Puede cambiar la página de redirección del inicio de sesión posterior agregando el parámetro de consulta post_logout_redirect_uri.You can change the post-sign-out redirect page by adding the post_logout_redirect_uri query parameter. Por ejemplo:For example:

GET /.auth/logout?post_logout_redirect_uri=/index.html

Se recomienda codificar el valor de post_logout_redirect_uri.It's recommended that you encode the value of post_logout_redirect_uri.

Al utilizar direcciones URL completas, la dirección URL debe hospedarse en el mismo dominio o configurarse como una dirección URL de redirección externa permitida para la aplicación.When using fully qualified URLs, the URL must be either hosted in the same domain or configured as an allowed external redirect URL for your app. En el ejemplo siguiente, para redirigir a https://myexternalurl.com que no se hospedado en el mismo dominio:In the following example, to redirect to https://myexternalurl.com that's not hosted in the same domain:

GET /.auth/logout?post_logout_redirect_uri=https%3A%2F%2Fmyexternalurl.com

Debe ejecutar el siguiente comando en Azure Cloud Shell:You must run the following command in the Azure Cloud Shell:

az webapp auth update --name <app_name> --resource-group <group_name> --allowed-external-redirect-urls "https://myexternalurl.com"

Conservación de los fragmentos de dirección URLPreserve URL fragments

Después de que los usuarios inician sesión en la aplicación, normalmente desean redirigirse a la misma sección de la misma página, como /wiki/Main_Page#SectionZ.After users sign in to your app, they usually want to be redirected to the same section of the same page, such as /wiki/Main_Page#SectionZ. Sin embargo, dado que los fragmentos de dirección URL (por ejemplo, #SectionZ) nunca se envían al servidor, no se conservan de forma predeterminada después de que el inicio de sesión de OAuth se complete y se redirija a la aplicación.However, because URL fragments (for example, #SectionZ) are never sent to the server, they are not preserved by default after the OAuth sign-in completes and redirects back to your app. Los usuarios obtienen una experiencia poco óptima cuando necesitan volver a navegar al delimitador deseado.Users then get a suboptimal experience when they need to navigate to the desired anchor again. Esta limitación se aplica a todas las soluciones de autenticación del servidor.This limitation applies to all server-side authentication solutions.

En la autenticación de App Service, puede conservar los fragmentos de dirección URL en el inicio de sesión de OAuth.In App Service authentication, you can preserve URL fragments across the OAuth sign-in. Para ello, establezca un valor de aplicación denominado WEBSITE_AUTH_PRESERVE_URL_FRAGMENT en true.To do this, set an app setting called WEBSITE_AUTH_PRESERVE_URL_FRAGMENT to true. Puede hacerlo el Azure Portal, o simplemente ejecute el siguiente comando en Azure Cloud Shell:You can do it in the Azure portal, or simply run the following command in the Azure Cloud Shell:

az webapp config appsettings set --name <app_name> --resource-group <group_name> --settings WEBSITE_AUTH_PRESERVE_URL_FRAGMENT="true"

Acceso a las notificaciones de usuarioAccess user claims

App Service pasa las notificaciones de usuario a la aplicación mediante encabezados especiales.App Service passes user claims to your application by using special headers. Las solicitudes externas no están autorizadas para establecer estos encabezados, por lo que solo están presentes si App Service los establece.External requests aren't allowed to set these headers, so they are present only if set by App Service. A continuación puede ver algunos encabezados de ejemplo:Some example headers include:

  • X-MS-CLIENT-PRINCIPAL-NAMEX-MS-CLIENT-PRINCIPAL-NAME
  • X-MS-CLIENT-PRINCIPAL-IDX-MS-CLIENT-PRINCIPAL-ID

El código escrito en cualquier lenguaje o plataforma puede obtener la información que necesita de estos encabezados.Code that is written in any language or framework can get the information that it needs from these headers. Para las aplicaciones de ASP.NET 4.6, ClaimsPrincipal se establece automáticamente con los valores adecuados.For ASP.NET 4.6 apps, the ClaimsPrincipal is automatically set with the appropriate values.

La aplicación también puede obtener detalles adicionales sobre el usuario autenticado mediante una llamada a /.auth/me.Your application can also obtain additional details on the authenticated user by calling /.auth/me. Los SDK del servidor de Mobile Apps proporcionan métodos de asistente para trabajar con estos datos.The Mobile Apps server SDKs provide helper methods to work with this data. Para más información, consulte Uso del SDK de Node.js de Azure Mobile Apps y Trabajar con el SDK del servidor back-end de .NET para Azure Mobile Apps.For more information, see How to use the Azure Mobile Apps Node.js SDK, and Work with the .NET backend server SDK for Azure Mobile Apps.

Recuperación de los tokens en el código de aplicaciónRetrieve tokens in app code

Desde el código de servidor, los tokens específicos del proveedor se inyectan en el encabezado de solicitud, por lo que puede acceder a ellos fácilmente.From your server code, the provider-specific tokens are injected into the request header, so you can easily access them. En la siguiente tabla se muestran los posibles nombres de encabezado de token:The following table shows possible token header names:

ProveedorProvider Nombres de encabezadosHeader names
Azure Active DirectoryAzure Active Directory X-MS-TOKEN-AAD-ID-TOKEN
X-MS-TOKEN-AAD-ACCESS-TOKEN
X-MS-TOKEN-AAD-EXPIRES-ON
X-MS-TOKEN-AAD-REFRESH-TOKEN
Token de FacebookFacebook Token X-MS-TOKEN-FACEBOOK-ACCESS-TOKEN
X-MS-TOKEN-FACEBOOK-EXPIRES-ON
GoogleGoogle X-MS-TOKEN-GOOGLE-ID-TOKEN
X-MS-TOKEN-GOOGLE-ACCESS-TOKEN
X-MS-TOKEN-GOOGLE-EXPIRES-ON
X-MS-TOKEN-GOOGLE-REFRESH-TOKEN
Cuenta MicrosoftMicrosoft Account X-MS-TOKEN-MICROSOFTACCOUNT-ACCESS-TOKEN
X-MS-TOKEN-MICROSOFTACCOUNT-EXPIRES-ON
X-MS-TOKEN-MICROSOFTACCOUNT-AUTHENTICATION-TOKEN
X-MS-TOKEN-MICROSOFTACCOUNT-REFRESH-TOKEN
TwitterTwitter X-MS-TOKEN-TWITTER-ACCESS-TOKEN
X-MS-TOKEN-TWITTER-ACCESS-TOKEN-SECRET

Desde el código de cliente (por ejemplo, una aplicación móvil o JavaScript en el explorador), envíe la solicitud GET HTTP a /.auth/me.From your client code (such as a mobile app or in-browser JavaScript), send an HTTP GET request to /.auth/me. El JSON devuelto tiene los tokens específicos del proveedor.The returned JSON has the provider-specific tokens.

Nota

Los tokens de acceso son para acceder a recursos de proveedor, por lo que solo están presentes si se configura el proveedor con un secreto de cliente.Access tokens are for accessing provider resources, so they are present only if you configure your provider with a client secret. Para ver cómo obtener tokens de actualización, consulte Tokens de acceso de actualización.To see how to get refresh tokens, see Refresh access tokens.

Actualización de los tokens de proveedor de identidadRefresh identity provider tokens

Cuando el token de acceso de su proveedor (no el token de sesión) expire, debe volver a autenticar al usuario antes de volver a usar ese token.When your provider's access token (not the session token) expires, you need to reauthenticate the user before you use that token again. Puede evitar la expiración del token mediante la realización de una llamada GET al punto de conexión /.auth/refresh de la aplicación.You can avoid token expiration by making a GET call to the /.auth/refresh endpoint of your application. Cuando se llama, App Service actualiza automáticamente los tokens de acceso en el almacén de tokens para el usuario autenticado.When called, App Service automatically refreshes the access tokens in the token store for the authenticated user. Las solicitudes posteriores para los tokens por código de aplicación obtienen los tokens actualizados.Subsequent requests for tokens by your app code get the refreshed tokens. Sin embargo, para que la actualización de token funcione, el almacén de tokens debe contener tokens de actualización para el proveedor.However, for token refresh to work, the token store must contain refresh tokens for your provider. Cada proveedor documenta la manera de obtener tokens de actualización, pero en la lista siguiente se muestra un breve resumen:The way to get refresh tokens are documented by each provider, but the following list is a brief summary:

  • Google: anexe un parámetro de cadena de consulta access_type=offline en su llamada API /.auth/login/google.Google: Append an access_type=offline query string parameter to your /.auth/login/google API call. Si usa el SDK de Mobile Apps, puede agregar el parámetro a una de las sobrecargas LogicAsync (vea Google Refresh Tokens (Tokens de actualización de Google)).If using the Mobile Apps SDK, you can add the parameter to one of the LogicAsync overloads (see Google Refresh Tokens).
  • Facebook: no proporciona tokens de actualización.Facebook: Doesn't provide refresh tokens. Los tokens de larga duración expiran en 60 días (vea Facebook Expiration and Extension of Access Tokens (Expiración y extensión de tokens de acceso de Facebook)).Long-lived tokens expire in 60 days (see Facebook Expiration and Extension of Access Tokens).
  • Twitter: los tokens de acceso no expiran [vea Twitter OAuth FAQ (Preguntas más frecuentes sobre Twitter OAuth)].Twitter: Access tokens don't expire (see Twitter OAuth FAQ).
  • Cuenta Microsoft: cuando defina la configuración de autenticación de Cuenta Microsoft, seleccione el ámbito wl.offline_access.Microsoft Account: When configuring Microsoft Account Authentication Settings, select the wl.offline_access scope.
  • Azure Active Directory: en https://resources.azure.com, siga estos pasos:Azure Active Directory: In https://resources.azure.com, do the following steps:
    1. En la parte superior de la página, seleccione Lectura y escritura.At the top of the page, select Read/Write.

    2. En el explorador de la izquierda, desplácese hasta subscriptions > <nombre_suscripción > resourceGroups > <nombre_grupo_recursos> > providers > Microsoft.Web > sites > <nombre_aplicación> > config > authsettings.In the left browser, navigate to subscriptions > <subscription_name > resourceGroups > <resource_group_name> > providers > Microsoft.Web > sites > <app_name> > config > authsettings.

    3. Haga clic en Editar.Click Edit.

    4. Modifique la siguiente propiedad.Modify the following property. Reemplace <app_id> por el identificador de aplicación de Azure Active Directory del servicio al que desea acceder.Replace <app_id> with the Azure Active Directory application ID of the service you want to access.

      "additionalLoginParams": ["response_type=code id_token", "resource=<app_id>"]
      
    5. Haga clic en Put.Click Put.

Una vez configurado el proveedor, puede buscar el token de actualización y el tiempo de expiración para el token de acceso en el almacén de tokens.Once your provider is configured, you can find the refresh token and the expiration time for the access token in the token store.

Para actualizar el token de acceso en cualquier momento, simplemente llame a /.auth/refresh en cualquier lenguaje.To refresh your access token at anytime, just call /.auth/refresh in any language. El fragmento de código siguiente utiliza jQuery para actualizar los tokens de acceso de un cliente de JavaScript.The following snippet uses jQuery to refresh your access tokens from a JavaScript client.

function refreshTokens() {
  let refreshUrl = "/.auth/refresh";
  $.ajax(refreshUrl) .done(function() {
    console.log("Token refresh completed successfully.");
  }) .fail(function() {
    console.log("Token refresh failed. See application logs for details.");
  });
}

Si un usuario revoca los permisos concedidos a la aplicación, la llamada a /.auth/me puede producir un error con un respuesta 403 Forbidden.If a user revokes the permissions granted to your app, your call to /.auth/me may fail with a 403 Forbidden response. Para diagnosticar errores, compruebe los registros de aplicación para más detalles.To diagnose errors, check your application logs for details.

Ampliación del período de gracia de expiración del token de sesiónExtend session token expiration grace period

La sesión autenticada expira después de 8 horas.The authenticated session expires after 8 hours. Después de que expire una sesión autenticada, hay un período de gracia de 72 horas de forma predeterminada.After an authenticated session expires, there is a 72-hour grace period by default. Dentro de este período de gracia, puede actualizar el token de sesión con App Service sin volver a autenticar al usuario.Within this grace period, you're allowed to refresh the session token with App Service without reauthenticating the user. Simplemente puede llamar a /.auth/refresh cuando el token de sesión deje de ser válido y no es necesario que realice un seguimiento usted mismo de la expiración del token.You can just call /.auth/refresh when your session token becomes invalid, and you don't need to track token expiration yourself. Una vez que transcurra el período de gracia de 72 horas, el usuario debe iniciar sesión de nuevo para obtener un token de sesión válido.Once the 72-hour grace period is lapses, the user must sign in again to get a valid session token.

Si 72 horas no es tiempo suficiente para usted, puede ampliar este período de expiración.If 72 hours isn't enough time for you, you can extend this expiration window. Extender la expiración durante un período prolongado podría tener implicaciones de seguridad importantes (por ejemplo, cuando un token de autenticación se pierde o roba).Extending the expiration over a long period could have significant security implications (such as when an authentication token is leaked or stolen). Por tanto, debe dejarla en el valor predeterminado de 72 horas o establecer el período de extensión en el valor más pequeño.So you should leave it at the default 72 hours or set the extension period to the smallest value.

Para extender el período de expiración predeterminado, ejecute el siguiente comando en Cloud Shell.To extend the default expiration window, run the following command in the Cloud Shell.

az webapp auth update --resource-group <group_name> --name <app_name> --token-refresh-extension-hours <hours>

Nota

El período de gracia solo se aplica a la sesión autenticada de App Service, no a los tokens de los proveedores de identidades.The grace period only applies to the App Service authenticated session, not the tokens from the identity providers. No hay ningún período de gracia para los tokens del proveedor expirados.There is no grace period for the expired provider tokens.

Limitación del dominio de cuentas de inicio de sesiónLimit the domain of sign-in accounts

Cuenta Microsoft y Azure Active Directory le permiten iniciar sesión desde varios dominios.Both Microsoft Account and Azure Active Directory lets you sign in from multiple domains. Por ejemplo, Cuenta Microsoft permite cuentas de outlook.com, live.com y hotmail.com.For example, Microsoft Account allows outlook.com, live.com, and hotmail.com accounts. Azure Active Directory permite cualquier número de dominios personalizados para las cuentas de inicio de sesión.Azure Active Directory allows any number of custom domains for the sign-in accounts. Este comportamiento puede no ser deseable para una aplicación interna, a la que no desea que cualquier persona con una cuenta de outlook.com acceda.This behavior may be undesirable for an internal app, which you don't want anyone with an outlook.com account to access. Para limitar el nombre de dominio de las cuentas de inicio de sesión, siga estos pasos.To limit the domain name of the sign-in accounts, follow these steps.

En https://resources.azure.com, desplácese hasta subscriptions > <nombre_ suscripción > resourceGroups > <nombre_ grupo_ recursos> > providers > Microsoft.Web > sites > <nombre_ aplicación> > config > authsettings.In https://resources.azure.com, navigate to subscriptions > <subscription_name > resourceGroups > <resource_group_name> > providers > Microsoft.Web > sites > <app_name> > config > authsettings.

Haga clic en Editar, modifique la propiedad siguiente y luego haga clic en Put.Click Edit, modify the following property, and then click Put. No olvide reemplazar <domain_name> por el dominio que desee.Be sure to replace <domain_name> with the domain you want.

"additionalLoginParams": ["domain_hint=<domain_name>"]

Pasos siguientesNext steps