Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 umożliwia jednokrotne logowanie, ustawiając plik cookie sesji podczas pierwszego uwierzytelnienia użytkownika. MSAL.js również buforuje tokeny ID i tokeny dostępu użytkownika w magazynie przeglądarki dla każdej domeny aplikacji. Dwa mechanizmy, plik cookie sesji Microsoft Entra i pamięć podręczna biblioteki Microsoft Authentication Library (MSAL), są niezależne od siebie, ale współpracują ze sobą, aby zapewnić działanie 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ć 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 instancje aplikacji w różnych kartach przeglądarki korzystają z tej samej pamięci podręcznej MSAL, a tym samym dzielą między sobą 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 zalogowania na kartach i oknach
Jednolite logowanie pomię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 SSO 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, używając metody ssoSilent
.
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
, za pomocą jednej z metod konta można uzyskać dostęp
Zalecamy używanie login_hint
opcjonalnego oświadczenia tokenu ID podanego ssoSilent
jako loginHint
jako najbardziej niezawodnej wskazówki konta dla cichych i interaktywnych żądań.
Korzystanie z wskazówki logowania
Opcjonalne login_hint
oświadczenie zawiera wskazówkę dla Microsoft Entra ID o koncie użytkownika, które próbuje 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 cichym, gdzie aplikacja A może zalogować użytkownika, odczytać loginHint
, a następnie wysłać oświadczenie i bieżący kontekst dzierżawy do aplikacji B. Microsoft Entra ID podejmie próbę wstępnego wypełnienia formularza logowania lub obejścia monitu dotyczącego wyboru konta i bezpośrednio przejść do procesu uwierzytelniania dla określonego użytkownika.
Jeśli informacje w oświadczeniu login_hint
nie są zgodne z żadnym istniejącym użytkownikiem, użytkownicy są przekierowywani, aby przejść przez standardowy proces logowania, w tym wybór konta.
Używanie identyfikatora sesji
Aby użyć identyfikatora sesji, dodaj sid
jako atrybut opcjonalny 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 także odzyskać konto użytkownika, korzystając z metod getAccountByUsername()
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 spróbować użyć metody ssoSilent
bez przekazywania żadnych account
, sid
lub login_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
na pustą stronę lub inną stronę, która nie używa systemu 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 iframe i ponownie użyć istniejącej sesji z Microsoft Entra ID. 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ść none może być używana razem z interaktywną metodą MSAL.js w celu realizacji logowania jednokrotnego. Aby uzyskać więcej informacji, zobacz Interakcyjne żądania z prompt=none . Jeśli masz już informacje logowania użytkownika, możesz przekazać jeden z opcjonalnych parametrów loginHint
lub sid
, aby się zalogować na określone konto.
Negowanie logowania jednokrotnego przy użyciu polecenia prompt=login
Jeśli wolisz, aby Microsoft Entra ID zażądać od użytkownika wprowadzenia poświadczeń pomimo aktywnej sesji z serwerem autoryzacji, możesz użyć parametru monitu login 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ówność funkcji z ADAL.js dla scenariuszy uwierzytelniania Microsoft Entra. Aby ułatwić migrację z ADAL.js do MSAL.js oraz współdzielić stan uwierzytelniania między aplikacjami, biblioteka odczytuje token ID 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: