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