Usar autenticación silenciosa en Azure AD

Importante

El soporte técnico y desarrollo de Microsoft para la biblioteca de autenticación de Active Directory (ADAL), incluidas las correcciones de seguridad, finaliza el 30 de junio de 2022. Para seguir recibiendo soporte técnico, actualice las aplicaciones para que usen la Biblioteca de autenticación de Microsoft (MSAL). Consulte Migración de aplicaciones a la biblioteca de autenticación de Microsoft (MSAL).

Nota

Para que la autenticación funcione para la pestaña en clientes móviles, asegúrese de que usa Teams SDK de JavaScript versión 1.4.1 o posterior.

La autenticación silenciosa en Azure AD minimiza el número de veces que un usuario escribe sus credenciales actualizando silenciosamente el token de autenticación. Para obtener una verdadera compatibilidad con el inicio de sesión único, consulte la documentación de inicio de sesión único.

Para mantener el cliente de código, use la biblioteca de autenticación de Azure AD para JavaScript para obtener un token de acceso Microsoft Azure Active Directory (Azure AD) de forma silenciosa. Si el usuario ha iniciado sesión recientemente, no verá un cuadro de diálogo emergente.

Aunque la biblioteca de autenticación de Active Directory está optimizada para aplicaciones de AngularJS, también funciona con aplicaciones de página única (SPA) de JavaScript.

Nota

Actualmente, la autenticación silenciosa solo funciona para las pestañas. No funciona al iniciar sesión desde un bot.

Funcionamiento de la autenticación silenciosa

La biblioteca de autenticación de Active Directory crea un iframe oculto para el flujo de concesión implícita de OAuth 2.0. Pero la biblioteca especifica prompt=none, por lo que Azure AD no muestra la página de inicio de sesión. La interacción del usuario puede ser necesaria si el usuario necesita iniciar sesión o conceder acceso a la aplicación. Si es necesaria la interacción del usuario, Azure AD devuelve un error que la biblioteca notifica a la aplicación. Si es necesario, la aplicación ahora puede mostrar una opción de inicio de sesión.

Cómo realizar la autenticación silenciosa

El código de este artículo procede de la aplicación de ejemplo de Teams que es el nodo de ejemplo de autenticación de Teams.

Inicie la pestaña configurable de autenticación silenciosa y sencilla mediante Azure AD y siga las instrucciones para ejecutar el ejemplo en el equipo local.

Inclusión y configuración de la biblioteca de autenticación de Active Directory

Incluya la biblioteca de autenticación de Active Directory en las páginas de pestaña y configure la biblioteca con el id. de cliente y la dirección URL de redireccionamiento:

<script src="https://secure.aadcdn.microsoftonline-p.com/lib/1.0.15/js/adal.min.js" integrity="sha384-lIk8T3uMxKqXQVVfFbiw0K/Nq+kt1P3NtGt/pNexiDby2rKU6xnDY8p16gIwKqgI" crossorigin="anonymous"></script>
<script type="text/javascript">
    // Active Directory Authentication Library configuration
    let config = {
        clientId: "YOUR_APP_ID_HERE",
        // redirectUri must be in the list of redirect URLs for the Azure AD app
        redirectUri: window.location.origin + "/tab-auth/silent-end",
        cacheLocation: "localStorage",
        navigateToLoginRequestUrl: false,
    };
</script>

Obtener el contexto del usuario

En la página de contenido de la pestaña, llame a app.getContext() para obtener una sugerencia de inicio de sesión para el usuario actual. La sugerencia se usa como loginHint en la llamada a Azure AD.

// Set up extra query parameters for Active Directory Authentication Library
// - openid and profile scope adds profile information to the id_token
// - login_hint provides the expected user name
if (loginHint) {
    config.extraQueryParameter = "scope=openid+profile&login_hint=" + encodeURIComponent(loginHint);
} else {
    config.extraQueryParameter = "scope=openid+profile";
}

Autenticar

Si la biblioteca de autenticación de Active Directory tiene un token sin explorar almacenado en caché para el usuario, use el token. Como alternativa, llame a acquireToken(resource, callback) para recibir silenciosamente un token. La biblioteca llama a una función de devolución de llamada con el token solicitado o genera un error si se produce un error en la autenticación.

Si recibe un error en la función de devolución de llamada, muestre y use una opción de inicio de sesión explícito.

let authContext = new AuthenticationContext(config); // from Active Directory Authentication Library
// See if there is a cached user and it matches the expected user
let user = authContext.getCachedUser();
if (user) {
    if (user.profile.oid !== userObjectId) {
        // User doesn't match, clear the cache
        authContext.clearCache();
    }
}

// In this example we are getting an id token (which Active Directory Authentication Library returns if we ask for resource = clientId)
authContext.acquireToken(config.clientId, function (errDesc, token, err, tokenType) {
    if (token) {
        // Make sure Active Directory Authentication Library gave us an ID token
        if (tokenType !== authContext.CONSTANTS.ID_TOKEN) {
            token = authContext.getCachedToken(config.clientId);
        }
        showProfileInformation(idToken);
    } else {
        console.log("Renewal failed: " + err);
        // Failed to get the token silently; show the login button
        showLoginButton();
        // You could attempt to launch the login popup here, but in browsers this could be blocked by
        // a popup blocker, in which case the login attempt will fail with the reason FailedToOpenWindow.
    }
});

Procesar el valor devuelto

La biblioteca de autenticación de Active Directory analiza el resultado de Azure AD llamando a AuthenticationContext.handleWindowCallback(hash) en la página de devolución de llamada de inicio de sesión.

Compruebe que tiene un usuario válido y llame a authentication.notifySuccess() o authentication.notifyFailure() para informar del estado a la página de contenido de la pestaña principal.

import { authentication } from "@microsoft/teams-js";
if (authContext.isCallback(window.location.hash)) {
    authContext.handleWindowCallback(window.location.hash);
    if (window.parent === window) {
        if (authContext.getCachedUser()) {
            authentication.notifySuccess();
        } else {
            authentication.notifyFailure(authContext.getLoginError());
        }
    }
}

Controlar el flujo de cierre de sesión

Use el siguiente código para controlar el flujo de cierre de sesión en la autenticación de Azure AD:

Nota

Al cerrar sesión desde la pestaña o el bot de Teams se borra la sesión actual.

function logout() {
localStorage.clear();
window.location.href = "@Url.Action("<<Action Name>>", "<<Controller Name>>")";
}

Consulte también