使用ADAL库的Azure Active Directory注销

时间:2015-08-24 00:21:27

标签: azure azure-active-directory adal

我使用Azure Azure Active Directory保护我的Web API,并在Azure管理门户中创建本机应用程序。这个本机应用程序基本上是一个MVC Web应用程序,我使用ADAL库获取令牌并使用该令牌调用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);

现在我需要注销并切换到另一个用户,但不知何故系统会记住用户凭据。我在身份验证上下文中清除令牌缓存并发布logout api请求,如下所示,其中***是我的租户ID。

[main]

authc.loginUrl = /login.jsp
authc.usernameParam = user
authc.passwordParam = pass
authc.rememberMeParam = remember

authc.successUrl  = /index.html

[users]

joe = 123, administrator

[roles]

administrator = *

[urls]

/login.jsp = authc, roles[administrator]

/index.html = authc, roles[administrator]

api调用成功,但注销不起作用。 如何退出并切换到其他用户?

3 个答案:

答案 0 :(得分:10)

我不认为这会奏效。您需要将用户重定向到注销URL才能注销。

以下是如何创建注销URI:

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

其中:

  • {0} - Azure Active Directory的完全限定名称,例如yourad.onmicrosoft.com或租户ID。
  • {1} - 在注销完成后必须重定向用户的应用程序的URL。这应该是正确的URL编码。

答案 1 :(得分:2)

如果您的目标是登录其他用户,则不必严格要求从Azure AD会话中注销第一个用户。您可以在AcquireToken调用中传递PrompBehavior.Always,这样您就可以保证用户使用干净的凭据收集UX来提示用户。 注意:如果要从应用程序擦除第一个用户的每个跟踪,您可以保留您拥有的缓存清理代码。 ADAL允许您为多个用户保留令牌,因此,如果您的应用程序作为多用户功能,这可能很有用 - 问题是,如果您这样做,在每个AcquireToken,您还必须指定您想要一个令牌的用户for或ADAL将不知道返回哪一个。如果您不需要同时拥有多个用户,则缓存清理+ PromptBehavior.Always仍然是最简单的路径。

答案 2 :(得分:1)

您可以执行此操作以清除缓存:

        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.removeAllCookie();
        CookieSyncManager.getInstance().sync();
        mAuthContext.getCache().removeAll();