Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Прежде чем приступить к этой статье, убедитесь, что вы узнаете, как войти в систему, получить маркеры и управлять временем существования маркеров.
Выход из системы
Процесс выхода из системы в MSAL состоит из двух шагов.
- Очистите кэш MSAL.
- Очистите сеанс на сервере идентификации.
Объект PublicClientApplication предоставляет два API, выполняющих эти действия.
msalInstance.logoutRedirect();
msalInstance.logoutPopup();
Эти API очистят кэш токенов, а также любые пользовательские и сеансовые данные, а затем перенаправят окно браузера или всплывающее окно на страницу выхода из системы на сервере. Затем сервер предложит пользователю выбрать учетную запись, из которой он хочет выйти, и перенаправит его обратно к вашему postLogoutRedirectUri, если выполнены следующие условия:
- Универсальный код ресурса (URI) регистрируется в качестве URL-адреса ответа для регистрации приложения
- URI указывается как
postLogoutRedirectUriлибо в конфигурацииPublicClientApplication, либо в запросе на выход из системы - У пользователя есть активный сеанс с поставщиком удостоверений
- (Сценарии MSA) В регистрации приложения настроен URL-адрес выхода через фронт-канал
Если какое-либо из указанных выше условий не выполнено, страница (или всплывающее окно) останется на странице выхода поставщика удостоверений.
ВАЖНО: Если эта навигация по выходу прерывается каким-либо образом, кэш MSAL может быть удален, но сеанс может по-прежнему сохраняться на сервере. Прежде чем вернуться в приложение, убедитесь, что навигация полностью завершена.
const msalConfig = {
auth: {
clientId: 'your_client_id',
authority: 'https://login.microsoftonline.con/{your_tenant_id}',
redirectUri: 'https://contoso.com',
postLogoutRedirectUri: 'https://contoso.com/homepage'
}
};
Запрос объектов
Параметры конфигурации можно предоставить каждому ИЗ API выхода для настройки поведения:
logoutRedirect
Использование logoutRedirect очищает локальный кэш маркеров пользователей, а затем перенаправляет окно на страницу выхода сервера. Не ожидается, что промис, возвращаемый logoutRedirect, будет разрешён, но при необходимости вы можете дождаться его выполнения, чтобы заблокировать выполнение другого кода до того, как будет инициировано перенаправление.
Параметры конфигурации можно предоставить для настройки поведения:
const currentAccount = msalInstance.getAccount({ homeAccountId });
await msalInstance.logoutRedirect({
account: currentAccount,
postLogoutRedirectUri: "https://contoso.com/loggedOut"
});
Пропуск выхода с сервера
Предупреждение
Если не выполнять выход из системы на сервере, сеанс пользователя останется активным на сервере, и пользователь сможет снова войти в ваше приложение без повторного ввода учётных данных.
Если вы хотите, чтобы приложение выполняло только локальный выход из системы, можно передать callback в параметр onRedirectNavigate запроса и сделать так, чтобы этот callback возвращал false.
msalInstance.logoutRedirect({
onRedirectNavigate: (url) => {
// Return false if you would like to stop navigation after local logout
return false;
}
});
Всплывающее окно выхода
API logoutPopup откроет страницу выхода из системы на сервере во всплывающем окне, что позволит приложению сохранить текущее состояние. В связи с этим, если вы решите использовать всплывающие окна для выхода из системы, необходимо учесть ещё несколько дополнительных моментов помимо logoutRedirect:
- Ожидается, что промис, возвращаемый
logoutPopup, будет исполнен после закрытия всплывающего окна -
postLogoutRedirectUriТребуется, чтобы MSAL могла закрыть всплывающее окно после завершения регистрации -
postLogoutRedirectUriоткроется во всплывающем окне, а не в главном кадре. Если вам нужно, чтобы приложение верхнего уровня было перенаправлено после выхода, можно использоватьmainWindowRedirectUriпараметр в запросе на выход.
Параметры конфигурации можно предоставить для настройки поведения.
const currentAccount = msalInstance.getAccount({ homeAccountId });
await msalInstance.logoutPopup({
account: currentAccount,
postLogoutRedirectUri: "https://contoso.com/loggedOut",
mainWindowRedirectUri: "https://contoso.com/homePage",
popupWindowAttributes: {
popupSize: {
height: 100,
width: 100
},
popupPosition: {
top: 100,
left: 100
}
}
});
Выход без подтверждения
Если в вашем клиентском приложении для токенов ID включено необязательное утверждение login_hint, вы можете использовать утверждение login_hint токена ID, чтобы выполнить «тихий» выход или выход без запроса при использовании logoutRedirect или logoutPopup. Существует два способа реализовать выход без запроса подтверждения:
Вариант 1: Разрешить MSAL автоматически извлекать login_hint из утверждений ID-токена учетной записи
Первый и самый простой вариант — передать в API выхода из системы объект учетной записи, для которой нужно завершить сеанс. MSAL проверит, доступно ли утверждение login_hint в ID-токене учетной записи, и автоматически добавит его в запрос завершения сеанса как logout_hint, чтобы пропустить запрос выбора учетной записи.
const currentAccount = msalInstance.getAccount({ homeAccountId });
// The account's ID Token must contain the login_hint optional claim to avoid the account picker
await msalInstance.logoutRedirect({ account: currentAccount});
Вариант 2. Вручную задайте параметр logoutHint в запросе на выход
В качестве альтернативы, если вы предпочитаете вручную задать logoutHint, вы можете извлечь утверждение login_hint в вашем приложении и задать его как logoutHint в запросе выхода:
const currentAccount = msalInstance.getAccount({ homeAccountId });
// Extract login hint to use as logout hint
const logoutHint = currentAccount.idTokenClaims.login_hint;
await msalInstance.logoutPopup({ logoutHint: logoutHint });
Примечание. В зависимости от выбранного API (перенаправления или всплывающего окна), приложение по-прежнему перенаправляет или открывает всплывающее окно для завершения сеанса сервера. Разница заключается в том, что пользователь не увидит или не будет взаимодействовать с запросом выбора учетной записи сервера.
Выход из системы через фронт-канал
Microsoft Entra ID и Azure AD B2C поддерживают функцию выхода OAuth front-channel, которая обеспечивает единый выход во всех приложениях, когда пользователь инициирует выход из системы. Чтобы воспользоваться этой функцией с MSAL.js, выполните следующие действия.
- В приложении создайте выделенную страницу выхода. Эта страница не должна выполнять какую-либо другую функцию, например получение маркеров на загрузке страницы (см. ниже сведения). Обратите внимание, что эта страница будет загружена в скрытом iframe и для пользователей Microsoft Entra ID и MSA будет включать параметры запроса
issиsid. - В центре администрирования Microsoft Entra перейдите на страницу Аутентификация для своего приложения и зарегистрируйте страницу из шага 1 в поле URL-адрес выхода через фронт-канал. Обратите внимание, что эта страница должна быть загружена через
https.
Требования к странице выхода через фронт-канал
Страница, используемая для выхода через фронт-канал, должна быть создана следующим образом:
- На загрузке страницы автоматически вызывается API MSAL
logoutRedirect. - В конфигурации
PublicClientApplicationзадайте дляsystem.allowRedirectInIframeзначениеtrue. - При вызове
logoutрекомендуется запретить перенаправление в iframe на страницу выхода (см. выше).
Пример:
const msal = new PublicClientApplication({
auth: {
clientId: "my-client-id"
},
system: {
allowRedirectInIframe: true
}
})
// Automatically on page load
msal.logoutRedirect({
onRedirectNavigate: () => {
// Return false to stop navigation after local logout
return false;
}
});
Теперь, когда пользователь выходит из другого приложения, URL-адрес выхода через фронт-канал вашего приложения будет загружен в скрытом iframe, а MSAL.js очистит свой кэш, чтобы завершить единый выход из системы.
Note
Выход через фронт-канал не всегда поддерживается в разных браузерах. Chromium включил разделение хранилища, а Firefox поддерживает аналогичный стандарт, ограничивающий возможность приложений выполнять выход через фронт-канал. Официальную документацию Entra по этой теме см. в разделе Ограничения выхода через фронт-канал без сторонних файлов cookie.
Примеры выхода через фронт-канал
В следующих примерах показано, как реализовать выход через фронт-канал с помощью MSAL.js:
- MSAL Angular v2: пример для Angular 11
- MSAL React: пример маршрутизатора React
Events
Если разные части приложения должны реагировать на состояние выхода без прямого доступа к обещанию, возвращенному logoutRedirect или logoutPopup вы можете использовать API событий.
События будут генерироваться при успешном или неуспешном выходе из системы, а также при открытии всплывающего окна при использовании logoutPopup.
Важные заметки
- Если в API выхода из системы не передается учетная запись или объект EndSessionRequest, выполняется выход из всех учетных записей.
- Если в API выхода из системы передана учетная запись, MSAL очистит только токены, связанные с этой учетной записью.
- Выход из системы на стороне сервера — это вспомогательная функция и, как таковая, выполняется по мере возможности. API выхода будут успешно выполняться, если локальный кэш приложения был успешно очищен, независимо от того, успешно ли выполнен выход на стороне сервера.
Дальнейшие шаги
Изучите более продвинутые темы, такие как: