Logowanie jednokrotne za pomocą biblioteki MSAL.js
Logowanie jednokrotne (SSO) zapewnia bardziej bezproblemowe środowisko dzięki zmniejszeniu liczby żądań poświadczeń przez użytkownika. Użytkownicy po raz wprowadzają swoje poświadczenia, a ustanowiona sesja może zostać ponownie użyta przez inne aplikacje na tym samym urządzeniu bez dalszego monitowania.
Microsoft Entra ID włącza logowanie jednokrotne, ustawiając plik cookie sesji, gdy użytkownik uwierzytelnia się po raz pierwszy. MSAL.js również buforuje tokeny identyfikatorów i tokeny dostępu użytkownika w magazynie przeglądarki na domenę aplikacji. Dwa mechanizmy, pliki cookie sesji firmy Microsoft i pamięć podręczna biblioteki Microsoft Authentication Library (MSAL) są niezależne od siebie, ale współpracują ze sobą, aby zapewnić zachowanie logowania jednokrotnego.
Logowanie jednokrotne między kartami przeglądarki dla tej samej aplikacji
Gdy użytkownik ma aplikację otwartą na kilku kartach i loguje się na jednej z nich, można zalogować się do tej samej aplikacji otwartej na innych kartach bez monitowania. W tym celu należy ustawić wartość cacheLocation w obiekcie konfiguracji MSAL.js, localStorage
jak pokazano w poniższym przykładzie:
const config = {
auth: {
clientId: "1111-2222-3333-4444-55555555",
},
cache: {
cacheLocation: "localStorage",
},
};
const msalInstance = new msal.PublicClientApplication(config);
W takim przypadku wystąpienia aplikacji na różnych kartach przeglądarki korzystają z tej samej pamięci podręcznej BIBLIOTEKI MSAL, a tym samym współużytkują między nimi stan uwierzytelniania. Zdarzenia biblioteki MSAL można również używać do aktualizowania wystąpień aplikacji, gdy użytkownik loguje się z innej karty lub okna przeglądarki. Aby uzyskać więcej informacji, zobacz: Synchronizowanie stanu zarejestrowanego na kartach i oknach
Logowanie jednokrotne między różnymi aplikacjami
Po uwierzytelnieniu użytkownika plik cookie sesji jest ustawiany w domenie Microsoft Entra w przeglądarce. MSAL.js korzysta z tego pliku cookie sesji w celu zapewnienia logowania jednokrotnego dla użytkownika między różnymi aplikacjami. W szczególności MSAL.js oferuje metodę ssoSilent
logowania użytkownika i uzyskiwania tokenów bez interakcji. Jeśli jednak użytkownik ma wiele kont użytkowników w sesji z identyfikatorem Microsoft Entra ID, zostanie wyświetlony monit o wybranie konta w celu zalogowania się. W związku z tym istnieją dwa sposoby osiągnięcia logowania jednokrotnego przy użyciu ssoSilent
metody .
Z wskazówką użytkownika
Aby zwiększyć wydajność i upewnić się, że serwer autoryzacji będzie szukać prawidłowej sesji konta, można przekazać jedną z następujących opcji w obiekcie ssoSilent
żądania metody w celu uzyskania tokenu w trybie dyskretnym.
login_hint
, które można pobrać zaccount
właściwości nazwy użytkownika obiektu lubupn
oświadczenia w tokenie identyfikatora. Jeśli aplikacja uwierzytelnia użytkowników za pomocą usługi B2C, zobacz: Konfigurowanie przepływów użytkownika B2C w celu emitowania nazwy użytkownika w tokenach identyfikatorów- Identyfikator sesji ,
sid
który można pobrać zidTokenClaims
account
obiektu. account
, z którego można pobrać jedną z metod konta
Zalecamy użycie opcjonalnego oświadczenia tokenu identyfikatora podanego login_hint
ssoSilent
jako loginHint
najbardziej niezawodnej wskazówki konta dla dyskretnych i interakcyjnych żądań.
Korzystanie z wskazówki logowania
Opcjonalne login_hint
oświadczenie zawiera wskazówkę dla identyfikatora Microsoft Entra o koncie użytkownika próbującym się zalogować. Aby pominąć monit wyboru konta zwykle wyświetlany podczas interakcyjnych żądań uwierzytelniania, podaj następujące loginHint
informacje:
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
}
}
W tym przykładzie loginHint
zawiera adres e-mail użytkownika lub nazwę UPN, która jest używana jako wskazówka podczas interakcyjnych żądań tokenów. Wskazówka może być przekazywana między aplikacjami, aby ułatwić logowanie jednokrotne w trybie dyskretnym, gdzie aplikacja A może zalogować użytkownika, odczytać loginHint
oświadczenie, a następnie wysłać oświadczenie i bieżący kontekst dzierżawy do aplikacji B. Identyfikator Entra firmy Microsoft podejmie próbę wstępnego wypełnienia formularza logowania lub obejścia monitu wyboru konta i bezpośrednio kontynuować proces uwierzytelniania dla określonego użytkownika.
Jeśli informacje w oświadczeniu login_hint
nie są zgodne z żadnym istniejącym użytkownikiem, są przekierowywane w celu przejścia przez standardowe środowisko logowania, w tym wybór konta.
Używanie identyfikatora sesji
Aby użyć identyfikatora sesji, dodaj sid
jako opcjonalne oświadczenie do tokenów identyfikatorów aplikacji. Oświadczenie sid
umożliwia aplikacji zidentyfikowanie sesji firmy Microsoft Entra użytkownika niezależnie od nazwy konta lub nazwy użytkownika. Aby dowiedzieć się, jak dodać opcjonalne oświadczenia, takie jak sid
, zobacz Zapewnianie opcjonalnych oświadczeń do aplikacji. Użyj identyfikatora sesji (SID) w żądaniach uwierzytelniania dyskretnego w ssoSilent
MSAL.js.
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
}
}
Korzystanie z obiektu konta
Jeśli znasz informacje o koncie użytkownika, możesz również pobrać konto użytkownika przy użyciu getAccountByUsername()
metod lub getAccountByHomeId()
:
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
}
}
Bez wskazówki użytkownika
Możesz podjąć próbę ssoSilent
użycia metody bez przekazywania dowolnej account
sid
metody lublogin_hint
, jak pokazano w poniższym kodzie:
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
}
}
Istnieje jednak prawdopodobieństwo wystąpienia błędów logowania dyskretnego, jeśli aplikacja ma wielu użytkowników w jednej sesji przeglądarki lub jeśli użytkownik ma wiele kont dla tej pojedynczej sesji przeglądarki. Jeśli dostępnych jest wiele kont, może zostać wyświetlony następujący błąd:
InteractionRequiredAuthError: interaction_required: AADSTS16000: Either multiple user identities are available for the current request or selected account is not supported for the scenario.
Błąd wskazuje, że serwer nie może określić, które konto ma się zalogować, i będzie wymagać jednego z parametrów w poprzednim przykładzie (account
, login_hint
, sid
) lub interakcyjnego logowania, aby wybrać konto.
Zagadnienia dotyczące używania ssoSilent
Identyfikator URI przekierowania (adres URL odpowiedzi)
Aby uzyskać lepszą wydajność i uniknąć problemów, ustaw redirectUri
wartość pustej strony lub innej strony, która nie używa biblioteki MSAL.
- Jeśli użytkownicy aplikacji będą używać tylko metod wyskakujących i dyskretnych, ustaw
redirectUri
właściwość naPublicClientApplication
obiekcie konfiguracji. - Jeśli aplikacja używa również metod przekierowania, ustaw wartość
redirectUri
dla poszczególnych żądań.
Pliki cookie innych firm
ssoSilent
próbuje otworzyć ukryty element iframe i ponownie użyć istniejącej sesji z identyfikatorem Entra firmy Microsoft. Nie będzie to działać w przeglądarkach, które blokują pliki cookie innych firm, takie jak Safari, i spowodują błąd interakcji:
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
Aby rozwiązać ten problem, użytkownik musi utworzyć interakcyjne żądanie uwierzytelniania przy użyciu elementu loginPopup()
lub loginRedirect()
. W niektórych przypadkach wartość monitu nie może być używana razem z interaktywną metodą MSAL.js w celu uzyskania logowania jednokrotnego. Aby uzyskać więcej informacji, zobacz Interakcyjne żądania z prompt=none . Jeśli masz już informacje logowania użytkownika, możesz przekazać loginHint
parametry lub sid
opcjonalne, aby zalogować się do określonego konta.
Negowanie logowania jednokrotnego przy użyciu polecenia prompt=login
Jeśli wolisz, aby identyfikator Entra firmy Microsoft monitować użytkownika o wprowadzenie poświadczeń pomimo aktywnej sesji z serwerem autoryzacji, możesz użyć parametru monitu logowania w żądaniach z MSAL.js. Aby uzyskać więcej informacji, zobacz MSAL.js monitu o zachowanie .
Udostępnianie stanu uwierzytelniania między ADAL.js i MSAL.js
MSAL.js zapewnia równoważność funkcji z ADAL.js dla scenariuszy uwierzytelniania entra firmy Microsoft. Aby przeprowadzić migrację z ADAL.js do MSAL.js łatwego i współużytkowanego stanu uwierzytelniania między aplikacjami, biblioteka odczytuje token identyfikatora reprezentujący sesję użytkownika w pamięci podręcznej ADAL.js. Aby skorzystać z tego podczas migracji z ADAL.js, należy upewnić się, że biblioteki są używane localStorage
do buforowania tokenów. Ustaw wartość na cacheLocation
localStorage
wartość w konfiguracji MSAL.js i ADAL.js podczas inicjowania w następujący sposób:
// 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);
Następne kroki
Aby uzyskać więcej informacji na temat logowania jednokrotnego, zobacz: