2014-11-21 7 views
2

У меня есть доказательство концепции W8.1-приложение, которое позволяет аутентифицировать пользователя с помощью Azure Active Directory с использованием библиотеки ADAL.ADAL: приложение W8.1 пытается зарегистрировать пользователя

У меня есть часть, позволяющая пользователю войти в систему и получить доступ к моим ресурсам. Однако он должен иметь возможность разрешить пользователю выйти из системы и разрешить другому пользователю входить в систему на одном устройстве.

Я нашел другие вопросы, на SO и в других местах, относительно аналогичного вопроса, но на IOS или в WPF-приложении. Там они предложили называть <AuthenticationContext>.TokenCache.Clear() и очистки куки с помощью с помощью следующего вызова:

private void ClearCookies() 
{ 
    const int INTERNET_OPTION_END_BROWSER_SESSION = 42; 
    InternetSetOption(IntPtr.Zero, INTERNET_OPTION_END_BROWSER_SESSION, IntPtr.Zero, 0); 
} 
[DllImport("wininet.dll", SetLastError = true)] 
private static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength); 

Ни работы (даже при совместном использовании). При вызове

AuthenticationResult ar = await authContext.AcquireTokenAsync("https://xxx", "yyyy", new Uri("ms-app://callback/") 
    , new AuthorizationParameters(PromptBehavior.Auto, true)); 

Если я использую PromptBehavior.Always, пользователь действительно должен всегда проверять подлинность себя, но он не использует кэш тогда.

Любые идеи о том, как я могу аннулировать токенше?

Заранее спасибо

Edit: решаемые

Благодаря vibronet, я был в состоянии успешно зарегистрировать пользователя путем сделать это:

authContext.TokenCache.Clear(); 
string requestUrl = "https://login.windows.net/common/oauth2/logout"; 
Task.Run(async() => 
{ 
    var client = new HttpClient(); 
    var request = new HttpRequestMessage(HttpMethod.Get, requestUrl); 
    var response = await client.SendAsync(request); 
}); 

Edit2

Вы также можете используйте URL-адрес для вашего приложения/арендатора, заменив «общий» на ваш псевдоним вашего арендатора, например:

string tenantAlias = "TenantAlias.onmicrosoft.com"; 
string requestUrl = string.Format("https://login.windows.net/{0}/oauth2/logout", tenantAlias); 
+0

Это не работает для меня. Сетевая трассировка показывает, что ответ представляет собой страницу, заполненную JavaScript, которая, очевидно, не будет работать здесь, плюс я могу увидеть настройку ответа и не очищать файлы cookie, такие как ESTSAUTH. –

ответ

2

Фактический сеанс пользователя определяется двумя различными компонентами: кеш-маркер (под управлением ADAL) и любые файлы отслеживания сеанса, которые могут присутствовать в системе (не под управлением ADAL).

Как вы заметили, вы можете легко позаботиться о части кеша токена. Однако указанная вами логика для очистки файлов cookie НЕ будет работать в приложениях Windows Store. Он работает на WPF, потому что для настольных приложений куки-кувшин, используемый во время аутентификации, является одним из самого приложения. В Windows Store аутентификация вступает в ногу с WebAuthenticationBroker, у которой есть своя банка cookie, которая является отдельной и недоступной из вашего кода приложения.

Самый надежный подход - не создавать постоянные файлы cookie (например, НЕ нажимать «запомнить меня» во время аутентификации). Однако, если вы закончите с таким файлом cookie, основной способ избавиться от него - это выпустить из этого же WebAuthenticationBroker - сервер позаботится о том, чтобы очистить вещи. С точки зрения кода:

string requestUrl = "https://login.windows.net/common/oauth2/logout"; 
Task.Run(async() => 
{ 
    try 
    { 
     await WebAuthenticationBroker.AuthenticateAsync(WebAuthenticationOptions.SilentMode, new Uri(requestUrl)); 
    } 
    catch (Exception) 
    { 
     // timeout. That's expected 
    } 
}); 
+0

Это не сработало, метод 'AuthenticateAsync()' генерирует исключение NotImplementedException. Тем не менее, выполнение простого HttpRequest с указанным вами URL-адресом выполнило трюк :) - обновленное исходное сообщение, чтобы включить предложение youre и решение - Спасибо :) –

+0

argh вы правы, я написал ответ для Windows 8.1, а не Windows PHONE 8.1 (чей WAB не поддерживает тихий вариант). Виноват!:-) Но рад, что у меня это получилось – vibronet