Einmaliges Anmelden mit MSAL.js

Single Sign-On (SSO) bietet eine nahtlosere Benutzerfunktionalität, indem die Häufigkeit verringert wird, mit der Benutzer nach ihren Anmeldeinformationen gefragt werden. Benutzer geben ihre Anmeldeinformationen einmal ein. Die eingerichtete Sitzung kann danach von anderen Anwendungen auf dem Gerät wiederverwendet werden, ohne weitere Aufforderungen zu erhalten.

Das Azure Active Directory (Azure AD) ermöglicht SSO, indem ein Sitzungscookie festgelegt wird, wenn sich ein Benutzer das erste Mal authentifiziert. MSAL.js ermöglicht die Verwendung des Sitzungscookies für SSO zwischen den Browserregisterkarten, die für eine oder mehrere Anwendungen geöffnet wurden.

SSO zwischen Browserregisterkarten für dieselbe Anwendung

Wenn ein Benutzer Ihre Anwendung in mehreren Registerkarten geöffnet hat und sich bei einer davon anmeldet, kann er in der Anwendung, die in anderen Registerkarten geöffnet ist, ohne entsprechende Aufforderung angemeldet werden. Dazu müssen Sie cacheLocation im MSAL.js-Konfigurationsobjekt wie unten gezeigt auf localStorage festlegen.

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

const msalInstance = new msal.PublicClientApplication(config);

SSO zwischen verschiedenen Anwendungen

Beim Authentifizieren eines Benutzers wird in der Azure AD-Domäne im Browser ein Sitzungscookie festgelegt. MSAL.js benötigt dieses Sitzungscookie, um einmaliges Anmelden für den Benutzer zwischen verschiedenen Anwendungen bereitzustellen. Außerdem speichert MSAL.js die ID- und Zugriffstoken des Benutzers im Browserspeicher in den einzelnen Anwendungsdomänen zwischen.

MSAL.js umfasst die ssoSilent-Methode, um den Benutzer ohne Interaktion anzumelden und Token abzurufen. Wenn der Benutzer in einer Azure AD-Sitzung über mehrere Benutzerkonten verfügt, wird er jedoch aufgefordert, ein Konto für die Anmeldung auszuwählen. Insofern gibt es zwei Möglichkeiten, SSO mit der ssoSilent-Methode zu erreichen.

Mit Benutzerhinweis

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 automatisch abzurufen.

  • Sitzungs-ID sid (die von idTokenClaims eines account-Objekts abgerufen werden kann)
  • login_hint (kann aus der Eigenschaft für den Benutzernamen des account-Objekts oder dem upn-Anspruch im ID-Token abgerufen werden)
  • account (kann mithilfe einer der account-Methoden abgerufen werden)

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 Azure AD-Sitzung eines Benutzers unabhängig vom Kontonamen oder vom 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
    }
}

Verwendung eines Anmeldehinweises

Um die Kontoauswahlaufforderung zu umgehen, die in der Regel bei interaktiven Authentifizierungsanforderungen angezeigt wird (bzw. für automatische Anforderungen, wenn der optionale Anspruch sid nicht konfiguriert wurde), geben Sie einen loginHint ein. Fügen Sie in mehrinstanzenfähigen Anwendungen außerdem einen domain_hint ein.

const request = {
  scopes: ["user.read"],
  loginHint: preferred_username,
  extraQueryParameters: { domain_hint: "organizations" },
};

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

Rufen Sie die Werte für loginHint und domain_hint aus dem ID-Token des Benutzers ab:

  • loginHint: Verwenden Sie den preferred_username-Anspruchswert des ID-Tokens.

  • domain_hint: Verwenden Sie den tid-Anspruchswert des ID-Tokens. Erforderlich in Anforderungen von mehrinstanzenfähigen Anwendungen, die die /common-Autorität verwenden. Optional für andere Anwendungen.

Weitere Informationen zu Anmeldehinweisen und Domänenhinweisen finden Sie unter Microsoft Identity Platform und OAuth 2.0-Autorisierungscodeflow.

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 wie im folgenden Code gezeigt versuchen, die ssoSilent-Methode zu verwenden, ohne account, sid oder login_hint zu übergeben:

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. Bei mehreren Konten kann u. U. der folgende Fehler angezeigt werden:

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, sodass einer der oben genannten Parameter (account, login_hint, sid) oder eine interaktive Anmeldung mit Kontoauswahl erforderlich ist.

Ü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 redirectUri für das PublicClientApplication-Konfigurationsobjekt fest.
  • Legen Sie redirectUri jeweils für eine Anforderung fest, wenn Ihre Anwendung auch Umleitungsmethoden verwendet.

Cookies anderer Anbieter

ssoSilent versucht, einen ausgeblendeten IFRAME zu öffnen und eine vorhandene Sitzung mit Azure AD wiederzuverwenden. Dies funktioniert nicht in 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.

Darüber hinaus ist das Anforderungsobjekt erforderlich, wenn die automatischen Methoden verwendet werden. 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.

Einmaliges Anmelden in ADAL.js mit Update auf MSAL.js

MSAL.js bietet Featureparität mit ADAL.js für Azure AD-Authentifizierungsszenarien. Um die Migration von ADAL.js zu MSAL.js zu vereinfachen und zu vermeiden, dass Ihre Benutzer zur erneuten Anmeldung aufgefordert werden, liest die Bibliothek das ID-Token für die Sitzung des Benutzers im Cache von ADAL.js und meldet den Benutzer nahtlos in MSAL.js an.

Um das einmalige Anmelden (SSO) bei einer Aktualisierung von ADAL.js nutzen zu können, müssen Sie sicherstellen, dass die Bibliotheken zum Zwischenspeichern von Token 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);

Sobald cacheLocation konfiguriert ist, kann MSAL.js den zwischengespeicherten Zustand des authentifizierten Benutzers in ADAL.js lesen und dazu verwenden, einmaliges Anmelden in MSAL.js zur Verfügung zu stellen.

Nächste Schritte

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