Выход из Azure Active Directory с помощью библиотеки ADAL

Я использовал Azure Active Directory для защиты своего веб-API и создаю собственное приложение на портале управления Azure. Это собственное приложение представляет собой веб-приложение MVC, и я использую библиотеку ADAL для получения токена и вызова API с этим токеном. Код, который я использовал для получения токена, показан ниже:

AuthenticationContext ac = new AuthenticationContext(authority);
AuthenticationResult ar = ac.AcquireToken(resourceID, clientID, redirectURI);
string accessToken = ar.AccessToken;

Теперь мне нужно выйти из системы и переключиться на другого пользователя, но каким-то образом учетные данные пользователя запоминаются системой. Я очищаю кеш токенов в контексте аутентификации и отправляю запрос api выхода из системы следующим образом, где *** - это мой идентификатор клиента.

//Log out after api call
ac.TokenCache.Clear();

string requestUrl = "https://login.windows.net/***/oauth2/logout";

var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, requestUrl);
var response = await client.SendAsync(request);

Вызов API выполнен успешно, но выход из системы не работает. Что мне делать, чтобы выйти из системы и переключиться на другого пользователя?


person de li    schedule 24.08.2015    source источник


Ответы (3)


Не думаю, что это сработает. Вам нужно будет перенаправить пользователя на URL-адрес выхода, чтобы выход работал.

Вот как вы можете создать URI выхода:

https://login.microsoftonline.com/{0}/oauth2/logout?post_logout_redirect_uri={1}

Где:

  • {0} - полное имя вашего Azure Active Directory, например yourad.onmicrosoft.com или идентификатор клиента.
  • {1} - URL-адрес вашего приложения, по которому пользователь должен быть перенаправлен обратно после завершения выхода. Это должно быть правильно закодировано в URL.
person Gaurav Mantri    schedule 24.08.2015
comment
Я попытался вызвать этот выход в iOS ADAL, но этого недостаточно, чтобы предотвратить исключение при изменении учетной записи. Кому-нибудь удалось войти в систему / выйти из системы с использованием ADALiOS и двух разных учетных записей? - person Luuk D. Jansen; 01.09.2015
comment
В случае с мобильным приложением. Что мне нужно сделать? - person Sagar Patil; 28.05.2019

Если вы хотите войти в систему под другим пользователем, вам не обязательно выходить из сеанса первого пользователя в его сеансе с Azure AD. Вы можете передать PrompBehavior.Always в вызове AcquireToken, так что вы гарантированно предложите пользователю чистый UX для сбора учетных данных. Примечание: если вы хотите стереть все следы первого пользователя из приложения, вы можете сохранить код очистки кеша, который у вас есть. ADAL позволяет вам хранить токены для нескольких пользователей, поэтому, если ваше приложение использует многопользовательские функции, это может быть полезно - уловка в том, что если вы это сделаете, в каждом AcquireToken вам также придется указывать, для какого пользователя вы хотите получить токен. в противном случае АДАЛ не будет знать, какой из них вернуть. Если вам не нужно несколько пользователей одновременно, очистка кеша + PromptBehavior. Всегда остается самым простым путем.

person vibronet    schedule 24.08.2015
comment
Не могли бы вы подтвердить, что в настоящее время это работает? Я использую библиотеку iOS ADAL с запросом AD_PROMPT_ALWAYS. Я не могу войти в систему с каким-либо другим пользователем, кроме первого пользователя, с которым я тестировал: (Ошибка ADAL: 19, другой пользователь прошел аутентификацию. Статус: 2). stackoverflow.com/questions/32312710/ - person Luuk D. Jansen; 01.09.2015
comment
Подтверждено для Android lib. - person Vladimir Ivanov; 07.08.2019

Вы можете сделать это для очистки кеша:

        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.removeAllCookie();
        CookieSyncManager.getInstance().sync();
        mAuthContext.getCache().removeAll();
person M.Eqbalazar    schedule 29.06.2016
comment
Это часть решения, они изменили последнюю часть удаления токенов из кеша: mAuthContext.getCache().clear(); Но это решение действительно работает! - person Vladimir; 07.10.2016