Einmaliges Anmelden mit MSAL.js

Einmaliges Anmelden (Single Sign-On, SSO) bietet eine nahtlosere Benutzererfahrung, indem die Anzahl der Benutzer reduziert wird, die zur Eingabe von Anmeldeinformationen aufgefordert werden. Benutzer geben ihre Anmeldeinformationen einmal ein, und die erstellte Sitzung kann von anderen Anwendungen auf demselben Gerät ohne weitere Aufforderung wiederverwendet werden.

Microsoft Entra ID ermöglicht SSO, indem beim erstmaligen Authentifizieren eines Benutzers ein Sitzungscookie gesetzt wird. MSAL.js speichert auch die ID-Token und Zugriffstoken des Benutzers im Browserspeicher pro Anwendungsdomäne. Die beiden Mechanismen, Microsoft Entra Sitzungscookies und Microsoft Authentication Library (MSAL) (MSAL)-Cache, sind unabhängig voneinander, arbeiten jedoch zusammen, um SSO-Verhalten bereitzustellen.

SSO zwischen Browser-Tabs derselben App

Wenn ein Benutzer eine Anwendung in mehreren Registerkarten geöffnet hat und sich bei einer davon anmeldet, kann er bei derselben App angemeldet werden, die auf anderen Registerkarten geöffnet ist, ohne dazu aufgefordert zu werden. Dazu müssen Sie die 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, wodurch der Authentifizierungsstatus zwischen ihnen geteilt wird. Sie können MSAL-Ereignisse auch zum Aktualisieren von Anwendungsinstanzen verwenden, wenn sich ein Benutzer über eine andere Browserregisterkarte oder ein anderes Fenster anmeldet. Weitere Informationen finden Sie unter: Synchronisieren des angemeldeten Zustands über Registerkarten und Fenster hinweg

SSO zwischen verschiedenen Apps

Wenn sich ein Benutzer authentifiziert, wird im Browser ein Sitzungscookie auf der Microsoft Entra-Domäne gesetzt. MSAL.js basiert auf diesem Sitzungscookies, um SSO für den Benutzer zwischen verschiedenen Anwendungen bereitzustellen. Insbesondere bietet MSAL.js die ssoSilent Methode, sich beim Benutzer anzumelden und Token ohne Interaktion abzurufen. Wenn der Benutzer jedoch mehrere Benutzerkonten in einer Sitzung mit Microsoft Entra ID hat, wird er aufgefordert, ein Konto für die Anmeldung zu wählen. Daher gibt es zwei Möglichkeiten, SSO mithilfe der ssoSilent Methode zu erreichen.

Mit Hinweis für Benutzer

Um die Leistung zu verbessern und sicherzustellen, dass der Autorisierungsserver nach der richtigen Kontositzung sucht, können Sie eine der folgenden Optionen im Anforderungsobjekt der ssoSilent Methode übergeben, um das Token im Hintergrund abzurufen.

Wir empfehlen, den login_hintoptionalen Anspruch im ID-Token zu verwenden, der für ssoSilent als loginHint bereitgestellt wird, da dies der zuverlässigste Kontohinweis für stille und interaktive Anforderungen ist.

Verwenden eines Anmeldehinweiss

Der optionale login_hint Claim gibt Microsoft Entra ID einen Hinweis darauf, welches Benutzerkonto versucht, sich anzumelden. Um die Kontoauswahlaufforderung zu umgehen, die in der Regel bei interaktiven Authentifizierungsanforderungen angezeigt wird, geben Sie folgendes loginHint 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
    }
}

Enthält in diesem Beispiel loginHint die E-Mail- oder UPN-Adresse des Benutzers, die während interaktiver Tokenanforderungen als Hinweis verwendet wird. Der Hinweis kann zwischen Anwendungen übergeben werden, um stilles SSO zu ermöglichen. Dabei kann Anwendung A einen Benutzer anmelden, den loginHint lesen und anschließend den Claim sowie den aktuellen Mandantenkontext an Anwendung B senden. Microsoft Entra ID wird versuchen, das Anmeldeformular vorab auszufüllen oder die Aufforderung zur Kontoauswahl zu umgehen und direkt mit dem Authentifizierungsprozess für den angegebenen Benutzer fortzufahren.

Wenn die Informationen im Anspruch login_hint keinem existierenden Benutzer entsprechen, erfolgt eine Umleitung zum standardmäßigen Anmeldeprozess einschließlich der Kontoauswahl.

Verwenden einer Sitzungs-ID

Um eine Sitzungs-ID zu verwenden, fügen Sie sid den ID-Token Ihrer App als optionalen Anspruch hinzu. Der sid Anspruch ermöglicht es einer Anwendung, die Microsoft Entra Sitzung eines Benutzers unabhängig von seinem Kontonamen oder Benutzernamen zu identifizieren. Informationen zum Hinzufügen optionaler Ansprüche wie sid finden Sie unter Stellen Sie Ihrer App optionale Ansprüche bereit. Verwenden Sie die Sitzungs-ID (SID) in Anforderungen zur stillen Authentifizierung, die Sie mit ssoSilent in MSAL.js ausführen.

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 über die Benutzerkontoinformationen verfügen, können Sie das Benutzerkonto auch über die Methoden getAccountByUsername() oder getAccountByHomeId() 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 Hinweis für den Benutzer

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

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 Möglichkeit von Fehlern bei der stillen Anmeldung, wenn mehrere Benutzer die Anwendung in derselben Browsersitzung verwenden oder wenn der Benutzer innerhalb derselben Browsersitzung über mehrere Konten 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 gibt an, dass der Server nicht bestimmen konnte, welches Konto angemeldet werden soll, und erfordert entweder einen der Parameter im vorherigen Beispiel (account, , login_hintsid) oder eine interaktive Anmeldung, um das Konto auszuwählen.

Überlegungen bei der Verwendung von ssoSilent

Umleitungs-URI (Antwort-URL)

Um eine bessere Leistung zu erzielen und Probleme zu vermeiden, legen Sie die redirectUri Option auf eine leere Seite oder eine andere Seite fest, die MSAL nicht verwendet.

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

Cookies von Drittanbietern

ssoSilentversucht, einen ausgeblendeten iFrame zu öffnen und eine vorhandene Sitzung mit Microsoft Entra ID wiederzuverwenden. Dies funktioniert nicht in Browsern, die Cookies von Drittanbietern wie Safari blockieren und zu einem Interaktionsfehler führen:

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 eine Anforderung zur interaktiven Authentifizierung mit loginPopup() oder loginRedirect() erstellen. In einigen Fällen kann der Eingabeaufforderungswert keine zusammen mit einer interaktiven MSAL.js Methode verwendet werden, um SSO zu erreichen. Weitere Informationen finden Sie unter Interaktive Anforderungen mit prompt=none . Wenn Sie bereits über die Anmeldeinformationen des Benutzers verfügen, können Sie entweder die optionalen Parameter loginHint oder sid übergeben, um ein bestimmtes Konto anzumelden.

SSO mit prompt=login deaktivieren

Wenn Microsoft Entra ID den Benutzer trotz einer aktiven Sitzung mit dem Autorisierungsserver zur Eingabe seiner Anmeldeinformationen auffordern soll, können Sie in Anfragen mit MSAL.js den Promptparameter login verwenden. Weitere Informationen finden Sie unter MSAL.js-Aufforderungsverhalten.

Teilen des Authentifizierungszustands zwischen ADAL.js und MSAL.js

MSAL.js bietet featureparität mit ADAL.js für Microsoft Entra Authentifizierungsszenarien. Damit die Migration von ADAL.js zu MSAL.js einfach ist und der Authentifizierungsstatus zwischen Apps freigegeben wird, liest die Bibliothek das ID-Token, das die Sitzung des Benutzers im ADAL.js Cache darstellt. Um dies bei der Migration von ADAL.js nutzen zu können, müssen Sie sicherstellen, dass die Bibliotheken localStorage für das Zwischenspeichern von Token verwenden. Legen Sie cacheLocation bei der Initialisierung sowohl in der MSAL.js- als auch in der ADAL.js-Konfiguration 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 zu SSO finden Sie unter: