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.
login_hint
, kann aus der username-Eigenschaft desaccount
-Objekts oder demupn
-Anspruch im ID-Token abgerufen werden. Falls Ihre App Benutzer*innen mithilfe von B2C authentifiziert, finden Sie unter Konfigurieren von B2C-Benutzerflows zum Ausgeben des Benutzernamens in ID-Tokens weitere Informationen.- Sitzungs-ID
sid
, die vonidTokenClaims
einesaccount
-Objekts abgerufen werden kann. account
, kann mithilfe einer der account-Methoden abgerufen werden
Es wird empfohlen, den optionalen ID-Tokenanspruch login_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
-KonfigurationsobjektredirectUri
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: