Вопрос или проблема
Я реализую MFA с использованием Entra Id (приложение для настольных ПК на .NET). Теперь, когда я пытаюсь выйти, я использую этот код
var accounts = await publicClient.GetAccountsAsync();
var account = accounts?.FirstOrDefault()
if (account != null)
{
//
// Удалить конкретную вошедшую в систему учетную запись из кэша
//
await publicClient.RemoveAsync(account);
}
Проблема в том, что я ожидаю выхода из этой учетной записи, но похоже, что это только удаляет кэш MSAL для этого пользователя и их токены, но не выходит из системы. Если я снова попробую войти в мое приложение, моя предыдущая учетная запись будет отображаться как “вошедшая в систему”, и нажимая на нее, я войду в систему как этот пользователь, не предоставляя учетные данные снова
Ответ или решение
Чтобы корректно выполнить выход из учетной записи Microsoft Entra ID в приложении на .NET и гарантировать, что пользователь не может войти без повторного ввода учетных данных, необходимо выполнить несколько шагов.
Ваш текущий код удаляет учетную запись из кэша MSAL, но для полного выхода также необходимо выполнить HTTP-запрос для отмены сеанса в службе аутентификации. Это поможет убедиться, что токены обновления и доступы более не действительны, и пользователь не сможет войти снова без повторной аутентификации.
Вот пример полного кода, который выполняет выход пользователя:
using Microsoft.Identity.Client;
public async Task LogoutAsync()
{
var accounts = await publicClient.GetAccountsAsync();
var account = accounts?.FirstOrDefault();
if (account != null)
{
// Удаление конкретной подписанной учетной записи из кэша
await publicClient.RemoveAsync(account);
// Формируем URL выхода
var tenantId = "ваш-идентификатор-арендатора"; // Замените на фактический
var logoutUri = $"https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/logout";
// Добавьте необходимые параметры
var postLogoutRedirectUri = "https://ваш-адрес-редиректа.com"; // Замените на ваш адрес редиректа
// Перенаправление пользователя на страницу выхода
var urlWithRedirect = $"{logoutUri}?post_logout_redirect_uri={Uri.EscapeDataString(postLogoutRedirectUri)}";
System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(urlWithRedirect) { UseShellExecute = true });
}
}
Разъяснения:
-
Удаление учетной записи из кэша: Вы правильно используете
publicClient.RemoveAsync(account)
. Это необходимо, чтобы удалить токены из кэша клиента MSAL. -
HTTP-запрос на выход: Создайте URL для выхода, используя идентификатор вашего арендатора. После выполнения перенаправления на этот URL, сессия пользователя будет завершена на стороне сервера.
-
Редирект после выхода: Убедитесь, что у вас есть настроенный URL перенаправления. Это URL, куда пользователь будет перенаправлен после успешного выхода.
Учтите:
- Проверьте, что ваш
tenantId
и адрес для перенаправления действительны и правильно настроены в Azure Portal. - Чтобы данный метод работал, ваше приложение должно быть правильно зарегистрировано и настроено для работы с OAuth 2.0, с соответствующими правами доступа.
После выполнения этих шагов при следующем входе в систему пользователь будет запрашиваться для повторного ввода учетных данных, так как сеанс будет завершен как на клиенте, так и на сервере.