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

Zalecamy użycie opcjonalnego oświadczenia tokenu identyfikatora podanego login_hintssoSilent 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ć loginHintoś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 accountsid 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ść 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 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 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: