Cuentas en el explorador MSAL

Esta es la documentación de cuentas específicas de la plataforma para la @azure/msal-browser biblioteca, que proporciona las siguientes API para acceder a las cuentas almacenadas en caché:

  • getAllAccounts(): devuelve todas las cuentas actualmente en la memoria caché. Admite un filtro opcional para devolver un conjunto específico de cuentas. Una aplicación debe elegir una cuenta para adquirir tokens de forma silenciosa.
  • getAccount(): devuelve la primera cuenta almacenada en caché que coincide con el filtro pasado. El orden en que las cuentas se leen de la memoria caché es arbitraria y no hay ninguna garantía de que la primera cuenta de la lista filtrada sea la misma para las dos llamadas de getAccount. Como se explica a continuación, aumentar el número de atributos de filtro proporcionará coincidencias más exactas.

Objeto de filtro de cuenta

La documentación del tipo AccountFilter enumera las propiedades que se pueden usar y combinar para filtrar las cuentas.

Note

Normalmente, no se garantiza que un único atributo de filtro de cuenta identifique un objeto de cuenta almacenado en caché. Agregar una combinación de atributos que no se repiten juntos, como homeAccountId + localAccountId, puede ayudar a refinar la búsqueda.

Note

realm está tenantId en la memoria caché.

Las SIGUIENTES getAccountBy API han quedado en desuso. getAccount() Use con un objeto de filtro adecuado en su lugar:

  • getAccountByHomeId(): use getAccount({ homeAccountId }) en su lugar.
  • getAccountByLocalId(): use getAccount({ localAccountId }) en su lugar.
  • getAccountByUsername(): use getAccount({ username }) en su lugar.

A continuación se muestran ejemplos de uso que abarcan estas API:


let homeAccountId = null; // Initialize global accountId (can also be localAccountId or username) used for account lookup later, ideally stored in app state

// This callback is passed into `acquireTokenPopup` and `acquireTokenRedirect` to handle the interactive auth response
function handleResponse(resp) {
    if (resp !== null) {
        homeAccountId = resp.account.homeAccountId; // alternatively: resp.account.homeAccountId or resp.account.username
    } else {
        const currentAccounts = myMSALObj.getAllAccounts();
        if (currentAccounts.length < 1) { // No cached accounts
            return;
        } else if (currentAccounts.length > 1) { // Multiple account scenario
            // Add account selection code here
            homeAccountId = ...
        } else if (currentAccounts.length === 1) {
            homeAccountId = currentAccounts[0].homeAccountId; // Single account scenario
        }
    }
}

Ahora, las propiedades de la cuenta, como : homeAccountId, localAccountIdy username se pueden usar para buscar la cuenta almacenada en caché antes de adquirir un token de forma silenciosa:

// This method attempts silent token acquisition and falls back on acquireTokenPopup
async function getTokenPopup(request, homeAccountId) {
    // In this case, accounts are filtered by homeAccountId, but more attributes can be added to refine the search and increase the precision of the account filter
    const accountFilter = {
        homeAccountId: homeAccountId,
    };
    request.account = myMSALObj.getAccount(accountFilter);
    return await myMSALObj.acquireTokenSilent(request).catch(async (error) => {
        // Handle error
        return await myMSALObj.acquireTokenPopup(request);
    });
}

Filtrado por sugerencia de inicio de sesión

A partir de , se pueden usar todos los valores de sugerencia de inicio de @azure/msal-browser@3.2.0sesión para buscar y filtrar cuentas. Para filtrar por sugerencia de inicio de sesión, MSAL comparará el loginHint valor del AccountFilter objeto con los siguientes atributos de cuenta (en orden de prioridad) para buscar coincidencias:

  • login_hint Notificación de token de identificador
  • username account (propiedad)
  • upn Notificación de token de identificador

Note

Todos los atributos anteriores se pueden pasar al filtro de cuenta como la loginHint propiedad . El filtro de cuenta también aceptará el username atributo como usernamey producirá una búsqueda más eficaz.

Uso de login_hint la notificación

const accountFilter = {
    loginHint: previouslyObtainedIdTokenClaims.login_hint;
};
request.account = myMSALObj.getAccount(accountFilter);
return await myMSALObj.acquireTokenSilent(request).catch(async (error) => {
    // Handle error
    return await myMSALObj.acquireTokenPopup(request);
});

Uso de "nombre de usuario"

Note

El username valor puede incluirse en el AccountFilter objeto como username o loginHint. Esto se debe a que la username notificación es uno de los tres valores (junto con las login_hint notificaciones de token de identificador y upn ) que el servicio de token acepta como sugerencia de inicio de sesión. Si la aplicación está segura de que el valor en cuestión es , usernamesi se establece como propiedad AccountFilter.username , se producirá un mejor rendimiento de búsqueda. Poder establecer un username valor como loginHint es útil si la aplicación utiliza una sugerencia de inicio de sesión y no mantiene el contexto sobre si ese valor procede de una usernamenotificación , o .upnlogin_hint

Pasar username como loginHint

const accountUsername = userProfile.username;
const accountFilter = {
    loginHint: accountUsername;
};
request.account = myMSALObj.getAccount(accountFilter);
return await myMSALObj.acquireTokenSilent(request).catch(async (error) => {
    // Handle error
    return await myMSALObj.acquireTokenPopup(request);
});

Pasar username como username

const accountUsername = userProfile.username;
const accountFilter = {
    username: accountUsername;
};
request.account = myMSALObj.getAccount(accountFilter);
return await myMSALObj.acquireTokenSilent(request).catch(async (error) => {
    // Handle error
    return await myMSALObj.acquireTokenPopup(request);
});

Uso de upn la notificación

const accountFilter = {
    loginHint: previouslyObtainedIdTokenClaims.upn;
};
request.account = myMSALObj.getAccount(accountFilter);
return await myMSALObj.acquireTokenSilent(request).catch(async (error) => {
    // Handle error
    return await myMSALObj.acquireTokenPopup(request);
});

API de cuenta activa

La @azure/msal-browser biblioteca también proporciona dos API cómodas para ayudarle a realizar un seguimiento de qué cuenta está actualmente "activa" y se debe usar para las solicitudes de token.

  • getActiveAccount(): devuelve la cuenta activa actual.
  • setActiveAccount(): recibe un objeto de cuenta y lo establece como la cuenta activa.

Decidir qué cuenta usar para adquirir tokens depende de la aplicación, sin embargo, una vez que haya determinado qué cuenta desea usar, simplemente llame a la setActiveAccount() API con el objeto de cuenta elegido. Las acquireTokenllamadas a , login o ssoSilent ahora usarán la cuenta activa de forma predeterminada si no se especifica una cuenta diferente en la solicitud individual. Para borrar la cuenta activa actualmente, puede llamar a setActiveAccount(null).

function login() {
    return myMsalObj.loginPopup().then((response) => {
        // After a successful login set the active account to be the user that just logged in
        myMsalObj.setActiveAccount(response.account);
    });
}

function getAccessToken() {
    // Providing an account in the token request is not required if there is an active account set
    return myMsalObj.acquireTokenSilent({ scopes: ["User.Read"] });
}

Nota: A partir de la versión 2.16.0, la cuenta activa se almacena en la ubicación de caché configurada en la PublicClientApplication instancia. Si usa una versión anterior, la cuenta activa se almacena en memoria y, por tanto, debe restablecerse en cada carga de página.

Autenticación de aplicaciones anidadas

Para las aplicaciones setActiveAccount() NAA y getActiveAccount() son NO-OP API. Aunque los usuarios pueden establecer y obtener cuentas activas, se omiten activamente, ya que siempre se espera que la aplicación NAA tenga una cuenta y la cuenta la proporcione la aplicación host con accountContext. En el futuro, cuando se admiten varias cuentas en los centros, se espera que cambie este comportamiento.

Notas

  • El ejemplo predeterminado msal-browser actual tiene un escenario de cuenta única en funcionamiento.
  • Si tiene un escenario de varias cuentas, modifique el ejemplo (en ) para enumerar todas las cuentas almacenadas en handleResponse()caché y elija una cuenta específica.
  • Si una aplicación quiere recuperar una cuenta basada en username, debe guardar username (de la respuesta de una login API para un usuario específico) antes de usar el username filtro en la getAccount() API.
  • getAllAccounts() devolverá varias cuentas si ha realizado varias solicitudes de token interactivas y el usuario ha seleccionado cuentas diferentes en dos o más de esas interacciones. Es posible que deba pasar prompt: "select_account" o prompt: "login" a la API de inicio de sesión o acquireToken interactiva para Microsoft Entra ID mostrar la pantalla de selección de la cuenta después de la primera interacción.
  • Las API de cuenta devuelven el estado de la cuenta local y no reflejan necesariamente el estado del servidor. Devuelven cuentas que han iniciado sesión anteriormente en esta aplicación mediante MSAL.js y la sesión del servidor puede o no estar activa.
  • Dos aplicaciones hospedadas en dominios diferentes no comparten el estado de la cuenta debido a que el dominio establece el almacenamiento del explorador.
  • getAllAccounts() no está ordenado y no se garantiza que esté en el mismo orden en varias llamadas.
  • Cada llamada correcta a una API acquireToken o login devolverá exactamente una cuenta.