Tokenlebensdauer, Ablauf und Verlängerung

Bevor Sie hier beginnen, stellen Sie sicher, dass Sie wissen, wie Sie Sich anmelden und Token erwerben.

Bei der Verwendung von MSAL.js sollten Sie die Auswirkungen des Tokenabrufs für Benutzer verstehen und wissen, wie Sie die Gültigkeitsdauer dieser Token verwalten.

Token-Lebensdauer und Ablauf

Sie können die Tokenlebensdauer von Zugriffs-, ID- oder SAML-Token (Security Assertion Markup Language) konfigurieren, die vom Microsoft Identity Platform ausgegeben werden. Einige der Informationen sind unten zusammengefasst.

ID-Token

ID-Token sind an eine bestimmte Kombination von Konto und Client gebunden und enthalten in der Regel Profilinformationen über den Benutzer. In der Regel stimmt die Lebensdauer der Benutzersitzung einer Webanwendung mit der der Lebensdauer der ID-Tokensitzung überein, die standardmäßig 24 Stunden beträgt. Weitere Informationen zum Konfigurieren von Tokenlebensdauern finden Sie hier.

Zugriffstoken

Zugriffstoken im Browser weisen einen standardmäßig empfohlenen Ablauf von 1 Stunde auf. Nach dieser 1 Stunde werden alle Beareraufrufe mit dem abgelaufenen Token abgelehnt. Dieses Token kann unbemerkt mithilfe des mit diesem Token abgerufenen Refresh-Tokens erneuert werden. Weitere Informationen zum Konfigurieren von Tokenlebensdauern finden Sie hier.

Aktualisierungs-Token

Aktualisierungstoken für Single-Page Anwendungen sind zeitlich begrenzte Aktualisierungstoken (in der Regel 24 Stunden ab dem Zeitpunkt des Abrufs). Dies ist ein nicht anpassbares, nicht verschiebbares Fenster, Lebensdauer. Wenn ein Aktualisierungstoken zum Erneuern eines Zugriffstokens verwendet wird, wird ein neues Aktualisierungstoken mit dem erneuerten Zugriffstoken abgerufen. Dieses neue Aktualisierungstoken hat eine Lebensdauer, die der verbleibenden Lebensdauer des ursprünglichen Aktualisierungstokens entspricht. Sobald ein Aktualisierungstoken abgelaufen ist, muss ein neuer Autorisierungscodefluss initiiert werden, um einen Autorisierungscode abzurufen und ihn für einen neuen Satz von Token zu handeln.

Hinweis: Wenn ein neues Aktualisierungstoken abgerufen wird, ersetzt msal.js das zwischengespeicherte Aktualisierungstoken durch das neue Aktualisierungstoken, das alte Aktualisierungstoken wird jedoch nicht vom Server ungültig und kann weiterhin verwendet werden, um Zugriffstoken bis zum Ablauf abzurufen.

Token-Aktualisierung

Das PublicClientApplication-Objekt stellt eine API namens acquireTokenSilent bereit, die dazu dient, ein nicht abgelaufenes Token ohne Benutzerinteraktion abzurufen. Dies geschieht in einigen Schritten:

  1. Überprüfen Sie, ob im Token-Cache bereits ein Token für scopes, client id, authority und/oder homeAccountIdentifier vorhanden ist.
  2. Wenn ein Token für die angegebenen Parameter vorhanden ist, stellen Sie dann sicher, dass wir genau eine Übereinstimmung erhalten, und prüfen Sie das Ablaufdatum.
  3. Wenn das Zugriffstoken nicht abgelaufen ist, gibt MSAL eine Antwort mit den relevanten Token zurück.
  4. Wenn das Zugriffstoken abgelaufen ist, aber das Aktualisierungstoken noch gültig ist, verwendet MSAL das angegebene Aktualisierungstoken, um einen neuen Tokensatz abzurufen und dann eine Antwort zurückzugeben.
  5. Wenn das Aktualisierungstoken abgelaufen ist, versucht MSAL, über ein ausgeblendetes iFrame im Hintergrund ein Zugriffstoken abzurufen. Dadurch wird die SID oder der Benutzername im Anspruchsobjekt des Kontos verwendet, um einen Hinweis auf die Sitzung des Benutzers abzurufen. Wenn dieser versteckte IFrame-Aufruf fehlschlägt, gibt MSAL einen Fehler vom Server als InteractionRequiredAuthError weiter, mit der Aufforderung, einen Autorisierungscode abzurufen, um einen neuen Satz von Tokens zu erhalten. Dazu können Sie einen Login- oder AcquireToken-API-Aufruf mit dem PublicClientApplication Objekt ausführen. Wenn die Sitzung noch aktiv ist, sendet der Server einen Code ohne Benutzeraufforderungen. Andernfalls muss der Benutzer seine Anmeldeinformationen eingeben.

Weitere Informationen zu den Konfigurationsparametern, die Sie für die Methode festlegen können, finden Sie acquireTokenSilent.

Vermeiden interaktiver Unterbrechungen in der Mitte der Sitzung eines Benutzers

In einigen Fällen kann es sinnvoll sein, erforderlichenfalls zu Beginn einer Benutzersitzung vorab eine Interaktion auszulösen, um sicherzustellen, dass Benutzer weiterhin Token im Hintergrund abrufen und Ihre Anwendung ohne weitere Unterbrechungen verwenden können. Sie können dies natürlich erreichen, indem Sie jedes Mal, wenn Ihre Anwendung zum ersten Mal geladen wird, Interaktion aufrufen, dies ist jedoch eine schlechte Benutzererfahrung und weniger performant, wenn ein Benutzer bereits Token aus einer vorherigen Sitzung oder einem anderen Fenster/Tab besitzt. Stattdessen können acquireTokenSilent Sie mit einigen Anforderungsparametern sicherstellen, dass der Cache über die erforderlichen Token verfügt, um für eine beliebige Zeitspanne im Hintergrund zurückzugeben.

Um sicherzustellen, dass acquireTokenSilent mindestens 1 Stunde lang gültige Token zurückgeben kann:

  • Rufen Sie acquireTokenSilent beim Laden der Seite auf, wobei der Anforderungsparameter forceRefresh auf true festgelegt ist. Dadurch wird der Cache übersprungen und ein neues Token abgerufen, das dann über den Cache bei nachfolgenden Aufrufen bereitgestellt werden kann.
  • Bei nachfolgenden Aufrufen lassen Sie forceRefresh ungesetzt oder explizit auf false, damit Token aus dem Cache abgerufen werden können.

Um sicherzustellen, dass acquireTokenSilent für einen beliebigen Zeitraum von bis zu 24 Stunden gültige Token zurückgeben kann:

  • Rufen Sie acquireTokenSilent beim Laden der Seite mit dem auf true gesetzten Anforderungsparameter forceRefresh & dem auf die gewünschte Dauer (in Sekunden) der Interaktionsfreiheit gesetzten Parameter refreshTokenExpirationOffsetSeconds auf.
  • Lassen Sie bei nachfolgenden Aufrufen forceRefresh und refreshTokenExpirationOffsetSeconds ungesetzt, um sicherzustellen, dass Token aus dem Cache bereitgestellt werden können

Wenn Sie beispielsweise sicherstellen möchten, dass der Benutzer Token für die nächsten 2 Stunden im Hintergrund abrufen kann:

var request = {
    scopes: ["Mail.Read"],
    account: currentAccount,
    forceRefresh: true,
    refreshTokenExpirationOffsetSeconds: 7200 // 2 hours * 60 minutes * 60 seconds = 7200 seconds
};

const tokenResponse = await msalInstance.acquireTokenSilent(request).catch(async (error) => {
    if (error instanceof InteractionRequiredAuthError) {
        // fallback to interaction when silent call fails
        await msalInstance.acquireTokenRedirect(request);
    }
});

Hinweis: Es gibt nie eine Garantie, dass ein Token im Hintergrund erworben werden kann, auch wenn das Aktualisierungstoken noch nicht abgelaufen ist. Die oben beschriebenen Muster sind Best-Effort-Versuche, die Interaktion zu unannenklichen Zeiten zu minimieren, aber die Möglichkeit erforderlicher Interaktionen innerhalb der gewünschten Zeitrahmen nicht zu beseitigen. Darüber hinaus geben nicht alle Identitätsanbieter die Ablaufzeit des Aktualisierungstokens zurück – in diesen Fällen wird der refreshTokenExpirationOffsetSeconds Anfrageparameter nicht ausgewertet.

Cache-Suchrichtlinie

Eine Cache-Nachschlagerichtlinie kann optional für die Anforderung bereitgestellt werden. Die Cache-Suchrichtlinien sind:

  • CacheLookupPolicy.Default - acquireTokenSilent versucht, ein Zugriffstoken aus dem Cache abzurufen. Wenn das Zugriffstoken abgelaufen ist oder nicht gefunden werden kann, wird das Aktualisierungstoken verwendet, um ein neues Token abzurufen. Schließlich wird acquireTokenSilent versuchen, im Hintergrund ein neues Zugriffstoken, ID-Token und Aktualisierungstoken zu beziehen, wenn das Aktualisierungstoken abgelaufen ist.
  • CacheLookupPolicy.AccessToken - acquireTokenSilent sucht nur nach Zugriffstoken im Cache. Es wird nicht versucht, Zugriffs- oder Aktualisierungstoken zu verlängern.
  • CacheLookupPolicy.AccessTokenAndRefreshToken - acquireTokenSilent versucht, ein Zugriffstoken aus dem Cache abzurufen. Wenn das Zugriffstoken abgelaufen ist oder nicht gefunden werden kann, wird das Aktualisierungstoken verwendet, um ein neues Token abzurufen. Wenn das Aktualisierungstoken abgelaufen ist, wird es nicht erneuert und acquireTokenSilent schlägt fehl.
  • CacheLookupPolicy.RefreshToken - acquireTokenSilent versucht nicht, Zugriffstoken aus dem Cache abzurufen und versucht stattdessen, das zwischengespeicherte Aktualisierungstoken für ein neues Zugriffstoken auszutauschen. Wenn das Aktualisierungstoken abgelaufen ist, wird es nicht erneuert und acquireTokenSilent schlägt fehl.
  • CacheLookupPolicy.RefreshTokenAndNetwork - acquireTokenSilent sucht nicht im Cache nach dem Zugriffstoken. Der Vorgang erfolgt direkt über das Netzwerk mit dem zwischengespeicherten Refresh-Token. Wenn das Aktualisierungstoken abgelaufen ist, wird versucht, es zu erneuern. Dies entspricht der Einstellung forceRefresh: true.
  • CacheLookupPolicy.Skip - acquireTokenSilent wird sowohl Zugriffs- als auch Aktualisierungstoken erneuern. Es wird nicht im Cache nachsehen. Dies schlägt immer fehl, wenn Drittanbietercookies vom Browser blockiert werden.

Codeausschnitte

var username = "test@contoso.com";
var currentAccount = msalInstance.getAccount({ username });
var silentRequest = {
    scopes: ["Mail.Read"],
    account: currentAccount,
    forceRefresh: false,
    cacheLookupPolicy: CacheLookupPolicy.Default // will default to CacheLookupPolicy.Default if omitted
};

var request = {
    scopes: ["Mail.Read"],
    loginHint: currentAccount.username // For v1 endpoints, use upn from idToken claims
};

const tokenResponse = await msalInstance.acquireTokenSilent(silentRequest).catch(async (error) => {
    if (error instanceof InteractionRequiredAuthError) {
        // fallback to interaction when silent call fails
        return await msalInstance.acquireTokenPopup(request).catch(error => {
            if (error instanceof InteractionRequiredAuthError) {
                // fallback to interaction when silent call fails
                return msalInstance.acquireTokenRedirect(request)
            }
        });
    }
});

Umleitung

var username = "test@contoso.com";
var currentAccount = msalInstance.getAccount({ username });
var silentRequest = {
    scopes: ["Mail.Read"],
    account: currentAccount,
    forceRefresh: false,
    cacheLookupPolicy: CacheLookupPolicy.Default // will default to CacheLookupPolicy.Default if omitted
};

var request = {
    scopes: ["Mail.Read"],
    loginHint: currentAccount.username // For v1 endpoints, use upn from idToken claims
};

const tokenResponse = await msalInstance.acquireTokenSilent(silentRequest).catch(error => {
    if (error instanceof InteractionRequiredAuthError) {
        // fallback to interaction when silent call fails
        return msalInstance.acquireTokenRedirect(request)
    }
});

Nächste Schritte

Erfahren Sie, wie Sie abmelden.