Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Единый вход (SSO) обеспечивает более удобный опыт, сокращая количество запросов учетных данных у пользователя. Пользователи вводят свои учетные данные один раз, и установивший сеанс можно повторно использовать другими приложениями на том же устройстве без необходимости ввода данных повторно.
Microsoft Entra ID обеспечивает единый вход, установив cookie сеанса при первой аутентификации пользователя. MSAL.js также кэширует идентификационные токены и токены доступа пользователя в хранилище браузера для каждого домена приложения. Два механизма, сеансовые cookie Microsoft Entra и кэш библиотеки аутентификации Microsoft (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 также можно использовать для обновления экземпляров приложений при входе пользователя на другой вкладке браузера или окне. Для получения дополнительной информации см. Синхронизация состояния входа в систему во вкладках и окнах
Взаимодействие SSO между различными приложениями
Когда пользователь проходит проверку подлинности, файл cookie сеанса устанавливается в домене Microsoft Entra в браузере. MSAL.js полагается на этот файл cookie сеанса для предоставления авторизации SSO для пользователя между различными приложениями. В частности, MSAL.js предлагает ssoSilent
метод для авторизации пользователя и получения токенов без взаимодействия. Однако если у пользователя несколько учетных записей пользователей в сеансе с идентификатором Microsoft Entra ID, им будет предложено выбрать учетную запись для входа. Таким образом, существует два способа обеспечения единого входа с использованием метода ssoSilent
.
С подсказкой пользователя
Чтобы повысить производительность и убедиться, что сервер авторизации будет искать правильный сеанс учетной записи, можно передать один из следующих параметров в объекте запроса метода ssoSilent
, чтобы незаметно получить токен.
-
login_hint
, который можно получить из свойства имени пользователя объектаaccount
или утвержденияupn
в токене идентификатора. Если приложение выполняет проверку подлинности пользователей с помощью B2C, см. статью "Настройка потоков пользователей B2C для выдачи имени пользователя в маркерах идентификатора" - Идентификатор сеанса
sid
, который можно извлечь изidTokenClaims
объектаaccount
. -
account
, из которого можно извлечь один из методов учетной записи.
Мы рекомендуем использовать login_hint
необязательное утверждение токена идентификатора, предоставляемое ssoSilent
, поскольку это наиболее надежная подсказка учетной записи для молчаливых и интерактивных запросов.
Использование указания имени для входа
Необязательное утверждение login_hint
предоставляет указание Microsoft Entra ID о попытке пользователя войти в учетную запись. Чтобы обойти запрос выбора учетной записи, который обычно отображается во время интерактивных запросов проверки подлинности, укажите следующее 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
содержит электронную почту пользователя или универсальное имя пользователя (UPN), которое используется в качестве указания во время интерактивных запросов токенов. Указание можно передать между приложениями для облегчения тихого единого входа (SSO), где приложение A может войти в систему пользователя, прочитать loginHint
, а затем отправить утверждение и текущий контекст клиента приложению B. Microsoft Entra ID попытается заранее заполнить форму входа или обойти запрос на выбор учетной записи и напрямую перейти к процессу аутентификации для указанного пользователя.
Если информация в 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
без передачи каких-либо account
, sid
или 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.
- Если пользователи приложения только всплывают и молчаливые методы, задайте
redirectUri
PublicClientApplication
объект конфигурации. - Если приложение также использует методы перенаправления, задайте его
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()
. В некоторых случаях значение none может использоваться вместе с интерактивным методом MSAL.js для достижения единого входа. См. Интерактивные запросы с prompt=none для получения дополнительной информации. Если у вас уже есть учетные данные пользователя, вы можете передать необязательные параметры loginHint
или sid
для входа в определенную учетную запись.
Отключение SSO (единого входа) с использованием prompt=login
Если вы предпочитаете, чтобы Microsoft Entra ID требовал у пользователя ввод учетных данных, несмотря на активный сеанс с сервером авторизации, можно использовать параметр запроса login в запросах с 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);
Следующие шаги
Дополнительную информацию о едином входе (SSO) см. здесь: