Единый вход с использованием MSAL.js

Единый вход (единый вход) обеспечивает более простой интерфейс, уменьшая количество пользователей, запрашиваемых пользователем учетных данных. Пользователи введите свои учетные данные один раз, и установленный сеанс можно повторно использовать другими приложениями на том же устройстве без дальнейшего запроса.

Идентификатор Microsoft Entra включает единый вход, задав файл cookie сеанса при первом проверке подлинности пользователя. MSAL.js также кэширует маркеры идентификаторов и маркеры доступа пользователя в хранилище браузера на домен приложения. Два механизма, файлы cookie сеансов Microsoft Entra и кэш библиотеки проверки подлинности Майкрософт (MSAL), не зависят друг от друга, но работают вместе, чтобы обеспечить поведение единого входа.

Единый вход между вкладками браузера для одного приложения

Когда у пользователя есть приложение, открытое на нескольких вкладках, и войдите в одно из них, они могут быть вошли в одно приложение, открытое на других вкладках, не запрашивая запрос. Для этого необходимо задать кэшLocation в объекте localStorage конфигурации MSAL.js, как показано в следующем примере:

const config = {
  auth: {
    clientId: "1111-2222-3333-4444-55555555",
  },
  cache: {
    cacheLocation: "localStorage",
  },
};

const msalInstance = new msal.PublicClientApplication(config);

В этом случае экземпляры приложений на разных вкладках браузера используют один и тот же кэш MSAL, поэтому совместно используют состояние проверки подлинности между ними. События MSAL также можно использовать для обновления экземпляров приложений при входе пользователя на другой вкладке браузера или окне. Дополнительные сведения см. в статье Синхронизация вошедшего в систему состояния на вкладках и окнах

Единый вход между различными приложениями

Когда пользователь проходит проверку подлинности, файл cookie сеанса устанавливается в домене Microsoft Entra в браузере. MSAL.js полагается на этот файл cookie сеанса для предоставления единого входа для пользователя между различными приложениями. В частности, MSAL.js предлагает ssoSilent метод входа пользователя и получения маркеров без взаимодействия. Однако если у пользователя несколько учетных записей пользователей в сеансе с идентификатором Microsoft Entra ID, им будет предложено выбрать учетную запись для входа. Таким образом, существует два способа обеспечения единого входа с использованием метода ssoSilent.

С подсказкой пользователя

Чтобы повысить производительность и убедиться, что сервер авторизации будет искать правильный сеанс учетной записи, можно передать один из следующих параметров в объекте запроса метода для автоматического ssoSilent получения маркера.

Мы рекомендуем использовать необязательное login_hintутверждение маркера идентификатора, предоставленное ssoSilent так же, как loginHint это наиболее надежная подсказка учетной записи для молчаливых и интерактивных запросов.

Использование указания имени для входа

Необязательное login_hint утверждение предоставляет указание идентификатору Microsoft Entra о попытке входа в учетную запись пользователя. Чтобы обойти запрос выбора учетной записи, который обычно отображается во время интерактивных запросов проверки подлинности, укажите следующее loginHint :

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

В этом примере loginHint содержит сообщение электронной почты пользователя или имя участника-пользователя, которое используется в качестве указания во время интерактивных запросов маркеров. Указание можно передать между приложениями для упрощения автоматического единого входа, где приложение A может войти в систему пользователя, прочитать loginHintи отправить утверждение и текущий контекст клиента приложению B. Идентификатор Microsoft Entra попытается предварительно заполнить форму входа или обойти запрос на выбор учетной записи и напрямую перейти к процессу проверки подлинности для указанного пользователя.

Если сведения в login_hint утверждении не соответствуют существующему пользователю, они перенаправляются для перехода через стандартный интерфейс входа, включая выбор учетной записи.

Использование идентификатора сеанса

Чтобы использовать идентификатор сеанса, добавьте sid в качестве необязательного утверждения к маркерам идентификатора приложения. Утверждение sid позволяет приложению определять сеанс Microsoft Entra пользователя независимо от имени учетной записи или имени пользователя. Дополнительные сведения о том, как добавить необязательные утверждения, такие как sid, см. статью Предоставление приложению необязательных утверждений. Используйте идентификатор сеанса (SID) в автоматических запросах проверки подлинности, которые вы выполняете с помощью 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
    }
}

Использование объекта учетной записи

Если вы располагаете сведениями об учетной записи пользователя, вы также можете получить ее с помощью методов getAccountByUsername() или 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
    }
}

Без подсказки пользователя

Вы можете попытаться использовать ssoSilent метод без передачи какого-либо accountsid кода или login_hint как показано в следующем коде:

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

Тем не менее, существует вероятность ошибок автоматического входа, если приложение имеет несколько пользователей в одном сеансе браузера или если у пользователя есть несколько учетных записей для этого сеанса браузера. Если доступны несколько учетных записей, может появиться следующая ошибка:

InteractionRequiredAuthError: interaction_required: AADSTS16000: Either multiple user identities are available for the current request or selected account is not supported for the scenario.

Ошибка указывает, что сервер не мог определить учетную запись для входа и потребует одного из параметров в предыдущем примере (account, login_hint, ) sidили интерактивного входа, чтобы выбрать учетную запись.

Рекомендации по использованию ssoSilent

URI перенаправления (URL-адреса ответа)

Для повышения производительности и во избежание проблем задайте для redirectUri пустую страницу или другую страницу, не использующую MSAL.

  • Если пользователи приложения только всплывают и молчаливые методы, задайте redirectUriPublicClientApplication объект конфигурации.
  • Если приложение также использует методы перенаправления, задайте его redirectUri на основе каждого запроса.

Сторонние файлы cookie

ssoSilent пытается открыть скрытый iframe и повторно использовать существующий сеанс с идентификатором Microsoft Entra. Это не будет работать в браузерах, которые блокируют сторонние файлы cookie, такие как Safari, и приводят к ошибке взаимодействия:

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

Чтобы устранить ошибку, пользователь должен создать интерактивный запрос проверки подлинности с помощью loginPopup() или loginRedirect(). В некоторых случаях значение запроса не может использоваться вместе с интерактивным методом MSAL.js для достижения единого входа. Дополнительные сведения см. в интерактивных запросах с запросом. Если у вас уже есть учетные данные пользователя, вы можете передать необязательные параметры loginHint или sid для входа в определенную учетную запись.

Отрицание единого входа с помощью запроса=login

Если вы предпочитаете идентификатор Microsoft Entra запрашивать у пользователя ввод учетных данных, несмотря на активный сеанс с сервером авторизации, можно использовать параметр запроса входа в запросах с MSAL.js. Дополнительные сведения см . в статье MSAL.js поведению запросов.

Совместное использование состояния проверки подлинности между ADAL.js и MSAL.js

MSAL.js обеспечивает четность функций с ADAL.js для сценариев проверки подлинности Microsoft Entra. Чтобы сделать миграцию из ADAL.js на MSAL.js простой и совместно использовать состояние проверки подлинности между приложениями, библиотека считывает маркер идентификатора, представляющий сеанс пользователя в ADAL.js кэше. Чтобы воспользоваться этим при миграции с ADAL.js, необходимо убедиться, что библиотеки используются localStorage для кэширования маркеров. Присвойте параметру cacheLocation значение localStorage в конфигурациях MSAL.js и ADAL.js при инициализации следующим образом.


// 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);

Следующие шаги

См. дополнительные сведения о едином входе: