使用ADAL库注销Azure Active Directory

7

我使用了我的Azure活动目录来保护我的Web API,并在Azure管理门户中创建了一个本地应用程序。这个本地应用程序基本上是一个MVC Web应用程序,我使用ADAL库获取令牌,并使用该令牌调用API。下面是我用来获取令牌的代码:

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

现在我需要退出并切换到另一个用户,但是系统会记住用户凭据。我清除了身份验证上下文中的令牌缓存,并发送了以下注销 API 请求,其中 *** 是我的租户 ID。

//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调用成功,但注销操作无效。我该怎么做才能注销并切换到另一个用户?
3个回答

14

我认为这不会起作用。您需要将用户重定向到注销 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 编码。

我尝试在iOS ADAL中调用此注销功能,但它不足以防止在更改帐户时出现异常。有人成功地使用ADALiOS登录/注销并使用两个不同的帐户吗? - Luuk D. Jansen
在移动应用程序的情况下,我需要做什么? - Sagar Patil

3
您可以通过以下步骤清除缓存:
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.removeAllCookie();
        CookieSyncManager.getInstance().sync();
        mAuthContext.getCache().removeAll();

这是解决方案的一部分,他们已经更改了从缓存中删除令牌的最后一部分:mAuthContext.getCache().clear(); 但是这个解决方案实际上是有效的! - Vladimir

3
如果您的目标是以不同的用户身份登录,您不需要严格注销第一个用户与Azure AD的会话。您可以在AcquireToken调用中传递PrompBehavior.Always,这样您就可以确保提示用户使用干净的凭据收集UX。 注意:如果您想从应用程序中清除第一个用户的所有痕迹,您可以保留缓存清除代码。ADAL允许您为多个用户保留令牌,因此如果您的应用程序具有多用户功能,则可能会很有用 - 问题在于如果您这样做,在每次AcquireToken时,您还必须指定您要为哪个用户获取令牌,否则ADAL将不知道要返回哪个用户的令牌。如果您不需要同时使用多个用户,则缓存清除+PromptBehavior.Always仍然是最简单的路径。

你能确认目前这个是否可用吗?我使用iOS ADAL库,使用AD_PROMPT_ALWAYS请求。我无法使用除第一个测试用户以外的任何其他用户登录:(ADAL错误:19,已验证不同的用户。状态:2)。http://stackoverflow.com/questions/32312710/adal-for-ios-exception-with-a-different-user-sign-on - Luuk D. Jansen
已确认适用于Android库。 - Vladimir Ivanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接