使用 ADAL 库注销 Azure Active Directory

Azure Active Directory Logout with ADAL library

我使用我的 Azure Active Directory 来保护我的网站 API 并且我在 Azure 管理门户中创建了一个本机应用程序。这个本机应用程序基本上是一个 MVC Web 应用程序,我使用 ADAL 库获取令牌并使用该令牌调用 api。我用来获取令牌的代码如下所示:

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

现在我需要注销并切换到另一个用户,但系统以某种方式记住了用户凭据。我清除了身份验证上下文中的令牌缓存并 post 注销 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 调用成功,但无法注销。 我应该如何注销并切换到另一个用户?

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

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

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

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