Единый вход с использованием 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
, который можно получить изaccount
свойства имени пользователя объекта илиupn
утверждения в маркере идентификатора. Если приложение выполняет проверку подлинности пользователей с помощью B2C, см. статью "Настройка потоков пользователей B2C для выдачи имени пользователя в маркерах идентификатора"- Идентификатор сеанса
account
,sid
который можно получить изidTokenClaims
объекта. account
, из которого можно извлечь один из методов учетной записи.
Мы рекомендуем использовать необязательное 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
метод без передачи какого-либо 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()
. В некоторых случаях значение запроса не может использоваться вместе с интерактивным методом 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);
Следующие шаги
См. дополнительные сведения о едином входе: