Einmaliges Anmelden mit MSAL.js

Einmaliges Anmelden (Single Sign-On, SSO) bietet ein nahtloseres Benutzererlebnis, da Benutzer weniger häufig nach ihren Anmeldeinformationen gefragt werden. Benutzer geben ihre Anmeldeinformationen einmalig ein, und anschließend kann die eingerichtete Sitzung von anderen Anwendungen auf dem Gerät ohne weitere Eingabeaufforderungen wiederverwendet werden.

Microsoft Entra ID ermöglicht das einmalige Anmelden durch Festlegen eines Sitzungscookies, wenn sich ein Benutzer das erste Mal authentifiziert. Außerdem speichert MSAL.js die ID- und Zugriffstoken des Benutzers im Browserspeicher in den einzelnen Anwendungsdomänen zwischen. Diese beiden Mechanismen – Microsoft Entra-Sitzungscookie und MSAL-Cache – sind unabhängig voneinander, arbeiten jedoch zusammen, um das SSO-Verhalten bereitzustellen.

SSO zwischen Browserregisterkarten für dieselbe Anwendung

Wenn ein Benutzer eine Anwendung auf mehreren Registerkarten geöffnet hat und sich auf einer dieser Registerkarten anmeldet, kann er auf anderen Registerkarten ohne erneute Eingabeaufforderung bei derselben Anwendung angemeldet werden. Dazu müssen Sie cacheLocation im MSAL.js-Konfigurationsobjekt auf localStorage festlegen, wie im folgenden Beispiel gezeigt:

const config = {
  auth: {
    clientId: "1111-2222-3333-4444-55555555",
  },
  cache: {
    cacheLocation: "localStorage",
  },
};

const msalInstance = new msal.PublicClientApplication(config);

In diesem Fall verwenden Anwendungsinstanzen in unterschiedlichen Browserregisterkarten denselben MSAL-Cache und teilen somit den Authentifizierungsstatus untereinander. Sie können MSAL-Ereignisse auch zum Aktualisieren von Anwendungsinstanzen verwenden, wenn sich ein Benutzer über eine andere Browserregisterkarte oder ein anderes Browserfenster anmeldet. Weitere Informationen finden Sie unter Registerkarten- und fensterübergreifendes Synchronisieren des Anmeldestatus.

SSO zwischen verschiedenen Anwendungen

Beim Authentifizieren eines Benutzers wird in der Microsoft Entra-Domäne im Browser ein Sitzungscookie festgelegt. MSAL.js benötigt dieses Sitzungscookie, um einmaliges Anmelden für den Benutzer zwischen verschiedenen Anwendungen bereitzustellen. „MSAL.js“ bietet insbesondere die ssoSilent-Methode, um den Benutzer ohne Interaktion anzumelden und Token abzurufen. Wenn der Benutzer in einer Microsoft Entra ID-Sitzung jedoch über mehrere Benutzerkonten verfügt, wird er aufgefordert, ein Konto für die Anmeldung auszuwählen. Insofern gibt es zwei Möglichkeiten, SSO mit der ssoSilent-Methode zu erreichen.

Mit Benutzerhinweis

Wenn Sie die Leistung verbessern und sicherstellen möchten, dass der Autorisierungsserver nach der richtigen Kontositzung sucht, können Sie eine der folgenden Optionen im Anforderungsobjekt der ssoSilent-Methode übergeben, um das Token automatisch abzurufen.

Es wird empfohlen, den optionalen ID-Tokenanspruchlogin_hint zu verwenden, der für ssoSilent als loginHint bereitgestellt wird, da dies der zuverlässigste Kontohinweis für automatische und interaktive Anforderungen ist.

Verwendung eines Anmeldehinweises

Der optionale Anspruch login_hint bietet Microsoft Entra ID einen Hinweis auf das Benutzerkonto, das versucht, sich anzumelden. Um die Kontoauswahlaufforderung zu umgehen, die in der Regel bei interaktiven Authentifizierungsanforderungen angezeigt wird, geben Sie loginHint wie folgt an:

const silentRequest = {
    scopes: ["User.Read", "Mail.Read"],
    loginHint: "user@contoso.com"
};

try {
    const loginResponse = await msalInstance.ssoSilent(silentRequest);
} catch (err) {
    if (err instanceof InteractionRequiredAuthError) {
        const loginResponse = await msalInstance.loginPopup(silentRequest).catch(error => {
            // handle error
        });
    } else {
        // handle error
    }
}

In diesem Beispiel enthält loginHint die E-Mail-Adresse oder den UPN des Benutzers oder der Benutzerin. Die Adresse oder der UPN wird als Hinweis bei interaktiven Tokenanforderungen verwendet. Der Hinweis kann zwischen Anwendungen übergeben werden, um einmaliges Anmelden im Hintergrund zu ermöglichen. Dabei kann Anwendung A eine*n Benutzer*in anmelden, loginHint lesen und dann den Anspruch und den aktuellen Mandantenkontext an Anwendung B senden. Microsoft Entra ID versucht, das Anmeldeformular vorab auszufüllen oder die Kontoauswahlaufforderung zu umgehen und direkt mit dem Authentifizierungsprozess für den angegebenen Benutzer bzw. die angegebene Benutzerin fortzufahren.

Wenn die Informationen im Anspruch login_hint nicht mit einem*r vorhandenen Benutzer*in übereinstimmen, wird er bzw. sie zur Standardanmeldung umgeleitet, einschließlich Kontoauswahl.

Verwendung einer Sitzungs-ID

Um eine Sitzungs-ID zu verwenden, fügen Sie sid als optionaler Anspruch zu den ID-Token Ihrer App hinzu. Der sid-Anspruch ermöglicht es der Anwendung, die Microsoft Entra-Sitzung eines Benutzers unabhängig vom Kontonamen oder Benutzernamen zu ermitteln. Informationen zum Hinzufügen optionaler Ansprüche wie sid finden Sie unter Bereitstellen optionaler Ansprüche für Ihre App. Verwenden Sie die Sitzungs-ID (SID) in automatischen Authentifizierungsanforderungen, die Sie mit ssoSilent in MSAL.js vornehmen.

const request = {
  scopes: ["user.read"],
  sid: sid,
};

 try {
    const loginResponse = await msalInstance.ssoSilent(request);
} catch (err) {
    if (err instanceof InteractionRequiredAuthError) {
        const loginResponse = await msalInstance.loginPopup(request).catch(error => {
            // handle error
        });
    } else {
        // handle error
    }
}

Verwenden eines Kontoobjekts

Wenn Sie die Benutzerkontoinformationen kennen, können Sie das Benutzerkonto auch mithilfe der getAccountByUsername()- oder getAccountByHomeId()-Methode abrufen:

const username = "test@contoso.com";
const myAccount  = msalInstance.getAccountByUsername(username);

const request = {
    scopes: ["User.Read"],
    account: myAccount
};

try {
    const loginResponse = await msalInstance.ssoSilent(request);
} catch (err) {
    if (err instanceof InteractionRequiredAuthError) {
        const loginResponse = await msalInstance.loginPopup(request).catch(error => {
            // handle error
        });
    } else {
        // handle error
    }
}

Ohne Benutzerhinweis

Sie können versuchen, die ssoSilent-Methode zu verwenden, ohne account, sid oder login_hint zu übergeben, wie im folgenden Code gezeigt:

const request = {
    scopes: ["User.Read"]
};

try {
    const loginResponse = await msalInstance.ssoSilent(request);
} catch (err) {
    if (err instanceof InteractionRequiredAuthError) {
        const loginResponse = await msalInstance.loginPopup(request).catch(error => {
            // handle error
        });
    } else {
        // handle error
    }
}

Es besteht jedoch die Wahrscheinlichkeit, dass Fehler bei der automatischen Anmeldung auftreten, wenn die Anwendung mehrere Benutzer in einer einzigen Browsersitzung aufweist oder wenn der Benutzer über mehrere Konten für die betreffende einzelne Browsersitzung verfügt. Der folgende Fehler kann angezeigt werden, wenn mehrere Konten verfügbar sind:

InteractionRequiredAuthError: interaction_required: AADSTS16000: Either multiple user identities are available for the current request or selected account is not supported for the scenario.

Der Fehler weist darauf hin, dass der Server nicht feststellen konnte, welches Konto zur Anmeldung verwendet werden soll, und dass entweder einer der Parameter aus dem vorherigen Beispiel (account, login_hint, sid) oder eine interaktive Anmeldung zur Auswahl des Kontos benötigt wird.

Überlegungen zur Verwendung von ssoSilent

Umleitungs-URI (Antwort-URL)

Legen Sie für eine bessere Leistung und zur Vermeidung von Problemen redirectUri auf eine leere Seite oder eine andere Seite fest, die MSAL nicht verwendet.

  • Wenn Ihre Anwendungsbenutzer nur Popup- und automatische Methoden verwenden, legen Sie für das PublicClientApplication-Konfigurationsobjekt redirectUri fest.
  • Wenn die Anwendung auch Umleitungsmethoden verwendet, legen Sie redirectUri pro Anforderung fest.

Cookies anderer Anbieter

ssoSilent versucht, einen ausgeblendeten IFRAME zu öffnen und eine vorhandene Sitzung mit Microsoft Entra ID wiederzuverwenden. Dies funktioniert nicht bei Browsern wie Safari, die Drittanbietercookies blockieren, sodass es zu einem Interaktionsfehler kommt:

InteractionRequiredAuthError: login_required: AADSTS50058: A silent sign-in request was sent but no user is signed in. The cookies used to represent the user's session were not sent in the request to Azure AD

Um den Fehler zu beheben, muss der Benutzer mit loginPopup() oder loginRedirect() eine interaktive Authentifizierungsanforderung erstellen. In einigen Fällen kann der Eingabeaufforderungswert none zusammen mit einer interaktiven MSAL.js-Methode verwendet werden, um SSO zu unterstützen. Weitere Informationen finden Sie unter Interaktive Anforderungen mit „prompt=none“. Wenn Sie bereits über die Anmeldeinformationen des Benutzers verfügen, können Sie entweder den optionalen Parameter loginHint oder sid übergeben, um sich bei einem bestimmten Konto anzumelden.

Negieren von SSO mit „prompt=login“

Wenn Microsoft Entra ID den Benutzer zur Eingabe von Anmeldeinformationen auffordern soll, obwohl eine aktive Sitzung mit dem Autorisierungsserver besteht, können Sie den Eingabeaufforderungsparameter login in Anforderungen mit „MSAL.js“ verwenden. Weitere Informationen finden Sie unter Eingabeaufforderungsverhalten von „MSAL.js“.

Teilen des Authentifizierungsstatus zwischen „ADAL.js“ und „MSAL.js“

MSAL.js bietet Featureparität mit ADAL.js für Microsoft Entra-Authentifizierungsszenarien. Um die Migration von „ADAL.js“ zu „MSAL.js“ zu vereinfachen und den Authentifizierungsstatus zwischen Apps zu teilen, liest die Bibliothek das ID-Token, das die Sitzung des Benutzers im ADAL.js-Cache darstellt. Wenn Sie dies bei einer Migration von „ADAL.js“ nutzen möchten, müssen Sie sicherstellen, dass die Bibliotheken zum Zwischenspeichern von Tokens localStorage verwenden. Legen Sie bei der Initialisierung cacheLocation in den Konfigurationen von MSAL.js und ADAL.js wie folgt auf localStorage fest:


// In ADAL.js
window.config = {
  clientId: "1111-2222-3333-4444-55555555",
  cacheLocation: "localStorage",
};

var authContext = new AuthenticationContext(config);

// In latest MSAL.js version
const config = {
  auth: {
    clientId: "1111-2222-3333-4444-55555555",
  },
  cache: {
    cacheLocation: "localStorage",
  },
};

const msalInstance = new msal.PublicClientApplication(config);

Nächste Schritte

Weitere Informationen zum einmaligen Anmelden (SSO) finden Sie unter: