Cachelagring i MSAL.js

När MSAL hämtar en token cachelagrar den för framtida användning. MSAL hanterar tokenlivslängder och uppdaterar åt dig. API:et acquireTokenSilent() hämtar åtkomsttoken från cachen för ett visst konto och förnyar dem om det behövs.

Cacheminneslagring

Du kan konfigurera lagringsplatsen för cachen via konfigurationsobjektet som används för att instansiera MSAL:

import { PublicClientApplication, BrowserCacheLocation } from "@azure/msal-browser";

const pca = new PublicClientApplication({
    auth: {
        clientId: "Enter_the_Application_Id_Here", // e.g. "00001111-aaaa-2222-bbbb-3333cccc4444" (guid)
        authority: "https://login.microsoftonline.com/Enter_the_Tenant_Info_Here", // e.g. "common" or your tenantId (guid),
        redirectUri: "/"
    },
    cache: {
       cacheLocation: BrowserCacheLocation.SessionStorage // "sessionStorage"
    }
});

Som standard lagrar MSAL de olika autentiseringsartefakter som hämtas från IdP:n i webbläsarlagringen med hjälp av webblagrings-API: et som stöds av alla moderna webbläsare. Därför erbjuder MSAL två metoder för beständig lagring: sessionStorage (standard) och localStorage. Dessutom tillhandahåller memoryStorage MSAL ett alternativ som gör att du kan välja bort lagring av cacheminnet i webbläsarens lagring.

Cachelagringsplats Rensat på Delas mellan fönster/flikar Omdirigeringsflöde stöds
sessionStorage stängning av fönster/flik No Yes
localStorage webbläsarstängning (såvida inte användaren har valt behåll mig inloggad) Yes Yes
memoryStorage uppdatering av sidan/navigering No No

Note

Även om autentiseringstillståndet kan gå förlorat i sessions- och minneslagring på grund av stängning av fönster/flik eller siduppdatering/navigering, har användarna fortfarande en aktiv session med IdP så länge sessionscookien inte har upphört att gälla och kanske kan autentisera igen utan några uppmaningar.

Valet mellan olika lagringsplatser återspeglar en kompromiss mellan bättre användarupplevelse och ökad säkerhet. Som tabellen ovan anger ger lokal lagring bästa möjliga användarupplevelse, medan minneslagring ger den bästa säkerheten eftersom ingen känslig information lagras i webbläsarens lagring. Mer information finns i avsnittet om säkerhet och cachelagrade artefakter nedan.

LocalStorage-anteckningar

Från och med v4 krypteras autentiseringsartefakter om du använder localStorage cacheplatsen såvida inte användaren väljer "Håll mig inloggad" under inloggningen. Krypteringsalgoritmen som används är AES-GCM med HKDF för att härleda nyckeln. Basnyckeln lagras i en sessionscookie med titeln msal.cache.encryption.

Den här cookien tas bort automatiskt när webbläsarinstansen (inte fliken) stängs, vilket gör det omöjligt att dekryptera autentiseringsartefakter när sessionen har avslutats. Dessa utgångna autentiseringsartefakter tas bort nästa gång MSAL initieras och användaren kan behöva autentisera igen. Platsen localStorage ger fortfarande cachepersistence mellan flikar för alla användare men bevaras bara mellan webbläsarsessioner för användare som har valt "Håll mig inloggad" (KMSI).

Important

Syftet med den här krypteringen är att minska autentiseringsartefakternas beständighet, inte att ge ytterligare säkerhet. Om en dålig aktör får åtkomst till webbläsarlagring skulle de också ha åtkomst till nyckeln eller ha möjlighet att begära token för din räkning utan att behöva cachelagrat alls. Det är ditt ansvar att se till att ditt program inte är sårbart för XSS-attacker. Mer information finns i avsnittet säkerhet .

Note

Cookielagring för tillfälliga autentiseringsartefakter är inaktuell i MSAL.js v4. Det här avsnittet behålls för program som fortfarande använder MSAL.js v3 eller tidigare.

MSAL Browser kan konfigureras för att använda cookies för lagring av tillfälliga autentiseringsartefakter. Med det här alternativet kan du stödja webbläsare som kan rensa lokal lagring/sessionslagring under omdirigeringsbaserade inloggningsflöden (t.ex. Internet Explorer, Firefox i privat läge). Observera att när det här alternativet väljs lagras själva token fortfarande i webbläsaren eller i minneslagringen. Mer information finns i konfigurationen .

Security

Vi anser att session/lokal lagring är säker så länge ditt program inte har skript mellan platser (XSS) och relaterade säkerhetsrisker. Se OWASP XSS Prevention Cheat Sheet för att skydda dina program mot XSS. Om du fortfarande är orolig rekommenderar vi att du använder alternativet memoryStorage i stället.

Cachade artefakter

För att underlätta effektiv tokenanskaffning och samtidigt upprätthålla ett bra UX cachelagrar MSAL olika artefakter som är resultatet av dess API-anrop. Nedan visas en sammanfattning av entiteter i MSAL-cacheminnet:

  • Beständiga artefakter (som kvarstår efter förfrågan – se även: tokenlivslängder)
    • åtkomsttoken
    • ID-token
    • uppdateringstoken
    • accounts
  • Tillfälliga artefakter (begränsade till begärans livslängd)
    • metadata för begäran (t.ex. state, nonce, auktoritet)
    • Felaktigheter
    • interaktionsstatus
  • Telemetri
    • tidigare misslyckad begäran
    • prestandauppgifter

Note

Tillfälliga cacheposter lagras alltid i sessionslagring eller i minnet. MSAL återgår till minneslagring om sessionslagring inte är tillgängligt.

Note

Auktoriseringskoden lagras bara i minnet och tas bort när den har lösts in för token.

temporaryCacheLocation åsidosättning

Note

Konfigurationsalternativet temporaryCacheLocation är inaktuellt i MSAL.js v4. Det här avsnittet behålls för program som fortfarande använder MSAL.js v3 eller tidigare.

Varning

Att åsidosätta temporaryCacheLocation bör ske med försiktighet, särskilt vid val av localStorage. Interaktion i mer än en flik/ett fönster stöds inte och du kan få interaction_in_progress fel oväntat. Det här är en escape-lucka, inte en funktion som stöds fullt ut.

När du använder MSAL.js med standardkonfigurationen i ett scenario där användaren omdirigeras efter lyckad autentisering i ett nytt fönster eller en ny flik avbryts OAuth 2.0-auktoriseringskoden med PKCE-flödet. I det här fallet går det ursprungliga fönstret eller fliken där autentiseringstillståndet (kodverifieraren och utmaningen) lagras bort och autentiseringsflödet misslyckas.

Om du vill hantera det här scenariot kan du konfigurera MSAL att använda localStorage som cacheplats genom att åsidosätta konfigurationsegenskapen temporaryCacheLocation . Detta gör att kodverifieraren och utmaningen kan lagras i webbläsarens localStorage, som är beständig över flera flikar och fönster.

Beständighet för cache vid uppgraderingar och återgångar av MSAL.js

Ibland behöver MSAL.js göra ändringar i formen på de cachelagrade artefakterna för att stödja nya krav, funktioner eller felkorrigeringar. Så ofta som möjligt görs dessa ändringar på ett bakåtkompatibelt sätt för att säkerställa att cacheminnet som finns i en användares webbläsare fortfarande kan användas när ett program uppgraderas till en ny version eller återställs till en äldre version. Detta är dock inte alltid möjligt och du kan hamna i ett tillstånd där flera kopior av cacheminnet finns samtidigt, en som används av den aktuella versionen av MSAL.js som körs och en annan som skrevs av den version som användes före uppgraderingen. Detta görs för att applikationer ska kunna återgå på ett kontrollerat sätt, om det behövs. I de allra flesta uppgraderingar migrerar MSAL.js alla befintliga cacheminnen till det nya formatet för en sömlös uppgradering. I sällsynta fall, till exempel vid en uppgradering från v3 till v4, kanske det inte är möjligt på grund av säkerhets- eller integritetskrav, och detta resulterar alltid i en höjning av huvudversionsnumret.

När en icke-bakåtkompatibel cacheändring görs sparas den äldre cachen som standard i 5 dagar för att möjliggöra en återställning om det behövs. Hur lång tid det gamla cacheminnet sparas kan konfigureras med hjälp av cachekonfigurationen cacheRetentionDaysPublicClientApplication. Om cachen inte har använts aktivt inom den tiden rensas den nästa gång MSAL.js initieras. Dessutom, om du inte räknar med att behöva återgå till en tidigare version, kan du ange detta värde till 0 för att ange att den gamla cachen alltid ska tas bort omedelbart när du uppgraderar till en ny version av MSAL.js. Om du däremot har ett längre distributionsfönster för uppgraderingar kan du välja att ange detta till ett längre värde.

Note

Åtkomst- och uppdateringstoken tas bort när de har upphört att gälla, även om de konfigurerade cacheRetentionDays ännu inte har nåtts. Giltiga åtkomsttoken kan också tas bort när som helst om webbläsarlagringen når sin lagringskvot. När lagringskvoter uppnås tas åtkomsttoken bort enligt principen först in, först ut, med början i poster som har skrivits av en tidigare version av MSAL.js och därefter i poster som har skrivits av den aktuella versionen av MSAL.js.

const config = {
    auth: {
        clientId: "<your-client-id>"
    },
    cache: {
        cacheLocation: "localStorage",
        cacheRetentionDays: 0 // Set this to the number of days you want old cache to be preserved in the event a rollback is needed (Default 5 days)
    }
}

const pca = new PublicClientApplication(config);
await pca.initialize();

Remarks

  • Vi rekommenderar inte att appar har affärslogik som är beroende av direkt användning av entiteter i cacheminnet. Använd i stället lämpligt MSAL-API när du behöver hämta token eller hämta konton.
  • Nycklar som används för att kryptera poP-token (proof of possession) lagras med hjälp av en kombination av IndexedDB API och minneslagring. Mer information finns i access-token-proof-of-possession.

Mer information