ADAL:W8.1应用程序试图将用户注销

时间:2014-11-21 12:56:39

标签: azure windows-8.1 azure-active-directory adal

我有一个概念验证W8.1-app,它允许使用ADAL库对Azure Active Directory用户进行身份验证。

我已经准备好让用户登录并访问我的资源了。但是,它应该能够允许用户注销,并允许其他用户登录同一设备。

我在SO和其他地方找到了关于类似问题的其他问题,但是在IOS或WPF应用程序中。在那里,他们建议使用以下呼叫呼叫<AuthenticationContext>.TokenCache.Clear()并清除cookie:

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,用户必须确实始终对自己进行身份验证,但它当时不会使用缓存。

关于如何使tokencache无效的任何想法?

提前致谢

编辑:已解决

感谢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

您还可以使用您的租户别名替换“common”来使用特定于您的应用/租户的网址,如下所示:

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

1 个答案:

答案 0 :(得分:2)

实际的用户会话由两个不同的组件决定:令牌缓存(在ADAL&#39; s控制下)和可能存在于系统中的任何会话跟踪cookie(不在ADAL&#39的控制下)。 / p>

正如您所指出的,您可以轻松处理令牌缓存部分。但是,您提到的用于清除cookie的逻辑将无法在Windows应用商店应用程序上运行。它适用于WPF,因为对于桌面应用程序,在身份验证期间使用的cookie jar是应用程序本身之一。在Windows应用商店中,身份验证与WebAuthenticationBroker同步,WebAuthenticationBroker有自己的cookie jar,它与您的应用程序代码是分开的,无法访问。

最强大的方法是不创建任何持久性cookie(例如,不要点击&#34;请记住我&#34;在身份验证期间)。但是,如果你最终得到这样一个cookie,摆脱它的主要方法是从同一个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 } }); 触发注销 - 服务器将负责清理。在代码方面:

{{1}}