Udostępnij za pośrednictwem


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

Zalecamy używanie login_hintopcjonalnego 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ść na PublicClientApplication 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 cacheLocationlocalStorage 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: