Konton i MSAL Browser

Det här är dokumentationen för plattformsspecifika konton för @azure/msal-browser biblioteket, som tillhandahåller följande API:er för åtkomst till cachelagrade konton:

  • getAllAccounts(): returnerar alla konton som för närvarande finns i cacheminnet. Stöder ett valfritt filter för att returnera en specifik uppsättning konton. Ett program måste välja ett konto för att hämta token tyst.
  • getAccount(): returnerar det första cachelagrade kontot som matchar filtret som skickas in. Ordningen i vilken konton läses från cacheminnet är godtycklig och det finns ingen garanti för att det första kontot i den filtrerade listan blir detsamma för två anrop av getAccount. Som beskrivs nedan ger en ökning av antalet filterattribut mer exakta matchningar.

Kontofilterobjekt

Dokumentationen accountfiltertyp visar de egenskaper som kan användas och kombineras för att filtrera konton.

Note

Ett enda kontofilterattribut garanteras vanligtvis inte att unikt identifiera ett cachelagrat kontoobjekt. Om du lägger till en kombination av attribut som inte upprepas tillsammans, till exempel homeAccountId + localAccountId, kan du förfina sökningen.

Note

realm finns tenantId i cacheminnet.

Följande getAccountBy API:er har blivit inaktuella. Använd getAccount() med ett lämpligt filterobjekt i stället:

  • getAccountByHomeId(): använd getAccount({ homeAccountId }) i stället.
  • getAccountByLocalId(): använd getAccount({ localAccountId }) i stället.
  • getAccountByUsername(): använd getAccount({ username }) i stället.

Följande är ett användningsexempel som omfattar dessa API:er:


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
        }
    }
}

Nu kan kontoegenskaper som: homeAccountId, localAccountIdoch username användas för att leta upp det cachelagrade kontot innan du hämtar en token tyst:

// 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);
    });
}

Filtrera efter inloggningstips

@azure/msal-browser@3.2.0Från och med kan alla inloggningstipsvärden användas för att söka efter och filtrera konton. För att filtrera efter inloggningstips jämför loginHint MSAL värdet i AccountFilter objektet med följande kontoattribut (i prioritetsordning) för att söka efter matchningar:

  • login_hint ID-tokenanspråk
  • username kontoegenskap
  • upn ID-tokenanspråk

Note

Alla attribut ovan kan skickas till kontofiltret som loginHint egenskap. Kontofiltret accepterar username även attributet som usernameoch ger en mer högpresterande sökning.

Använda login_hint anspråk

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);
});

Använda "användarnamn"

Note

Värdet username kan ingå i AccountFilter objektet som antingen username eller loginHint. Det beror på att anspråket username är ett av de tre värdena (tillsammans med tokenanspråken login_hint och upn ID:t) som tokentjänsten accepterar som inloggningstips. Om ditt program är säkert att värdet i fråga är en username, ger inställningen den AccountFilter.username som egenskapen bättre sökprestanda. Att kunna ange ett username värde som loginHint är användbart om ditt program använder ett inloggningstips och inte behåller kontexten för huruvida det värdet kom från ett anspråk login_hinteller upn ett usernameanspråk.

Skicka username som 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);
});

Skicka username som 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);
});

Använda upn anspråk

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:er för aktivt konto

Biblioteket @azure/msal-browser innehåller också två praktiska API:er som hjälper dig att hålla reda på vilket konto som för närvarande är "aktivt" och bör användas för tokenbegäranden.

  • getActiveAccount(): Returnerar det aktuella aktiva kontot
  • setActiveAccount(): Tar emot ett kontoobjekt och anger det som aktivt konto

Att bestämma vilket konto som ska användas för att hämta token är appberoende, men när du har fastställt vilket konto du vill använda anropar du helt enkelt API:et setActiveAccount() med det valda kontoobjektet. Alla acquireToken, login eller ssoSilent -anrop använder nu det aktiva kontot som standard om ett annat konto inte anges i den enskilda begäran. Om du vill rensa det aktiva kontot kan du anropa 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"] });
}

Obs! Från och med version 2.16.0 lagras det aktiva kontot på den cacheplats som konfigurerats på din PublicClientApplication instans. Om du använder en tidigare version lagras det aktiva kontot i minnet och måste därför återställas vid varje sidinläsning.

Kapslad appautentisering

För NAA-program setActiveAccount() och getActiveAccount() är NO-OP API:er. Även om användarna kan ange och hämta aktiva konton ignoreras de aktivt eftersom NAA-programmet alltid förväntas ha ett konto och kontot tillhandahålls av värdprogrammet med accountContext. I framtiden när flera konton stöds i hubbarna förväntas det här beteendet ändras.

Noteringar

  • Det aktuella standardexemplet för msal-browser har ett scenario med ett enda fungerande konto.
  • Om du har ett scenario med flera konton ändrar du exemplet (i handleResponse()) för att visa en lista över alla cachelagrade konton och välja ett specifikt konto.
  • Om ett program vill hämta ett konto baserat på usernamemåste det spara username (från svaret från ett login API för en specifik användare) innan du username använder filtret i API:et getAccount() .
  • getAllAccounts() returnerar flera konton om du har gjort flera interaktiva tokenbegäranden och användaren har valt olika konton i två eller flera av dessa interaktioner. Du kan behöva skicka prompt: "select_account" eller prompt: "login" till det interaktiva acquireToken- eller inloggnings-API:et för att Microsoft Entra ID ska kunna visa skärmen för kontoval efter den första interaktionen.
  • Konto-API:erna returnerar lokalt kontotillstånd och återspeglar inte nödvändigtvis servertillståndet. De returnerar konton som tidigare har loggat in i den här appen med hjälp av MSAL.js och serversessionen kan fortfarande vara aktiv.
  • Två appar som finns på olika domäner delar inte kontotillstånd på grund av att webbläsarlagringen delas av domänen.
  • getAllAccounts() är inte ordnad och är inte garanterad att vara i samma ordning över flera anrop
  • Varje lyckat anrop till ett acquireToken- eller inloggnings-API returnerar exakt ett konto