WebAccount SignOutAsync() не удаляет учетную запись / токен из локального кэша
Наше приложение UWP использует Azure AD для аутентификации. Когда я запустил приложение, мне предложили войти, что я и сделал, и аутентификация прошла успешно. Теперь я не могу вернуться в состояние "выписан". Всякий раз, когда я запускаю приложение, я автоматически выполняю вход. Я позвонил SignOutAsync()
на веб-счет, но, похоже, не имеет никакого эффекта.
Сначала я называю это:
private async Task SignOutAccountAsync(WebAccount account)
{
// remove local settings
ApplicationData.Current.LocalSettings.Values.Remove("CurrentUserWebAccountProviderId");
ApplicationData.Current.LocalSettings.Values.Remove("CurrentUserWebAccountId");
await account.SignOutAsync();
}
И затем я вызываю следующее, которое успешно и регистрирует меня, не требуя никакого взаимодействия.
WebTokenRequest wtr = new WebTokenRequest(wap, string.Empty, clientId);
wtrr = await WebAuthenticationCoreManager.RequestTokenAsync(wtr);
Как выйти из системы и заставить пользователя повторно пройти аутентификацию в приложении?
Редактировать: Вот более понятный пример, где я вхожу, выхожу, создаю экземпляры всех объектов, использованных для входа, а затем снова захожу.
// silent login
wtrr = await WebAuthenticationCoreManager.RequestTokenAsync(wtr);
userWebAccount = wtrr.ResponseData.First().WebAccount;
// sign out
await userWebAccount.SignOutAsync();
// use new objects to try again
wap = await WebAuthenticationCoreManager.FindAccountProviderAsync("https://login.microsoft.com", authority);
wtr = new WebTokenRequest(wap, string.Empty, clientId);
wtr.Properties.Add("resource", resource);
// silent login works again, despite having called SignOutAsync().
wtrr = await WebAuthenticationCoreManager.RequestTokenAsync(wtr);
1 ответ
Я думаю, что вам может не хватать здесь, что вы удаляете значения из локальных настроек, но объекты wap и clientId по- прежнему имеют значения, которые впоследствии могут быть доступны пользователю для входа. войдите в систему, или, если они являются локальными для класса, очистите их при выходе.
private async Task SignOutAccountAsync(WebAccount account)
{
// remove local settings
ApplicationData.Current.LocalSettings.Values.Remove("CurrentUserWebAccountProviderId");
ApplicationData.Current.LocalSettings.Values.Remove("CurrentUserWebAccountId");
wap = "";
clientId = "";
await account.SignOutAsync();
}