gpt4 book ai didi

azure - ADAL:W8.1 应用程序尝试注销用户

转载 作者:行者123 更新时间:2023-12-02 23:51:03 24 4
gpt4 key购买 nike

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

关于如何使 token 缓存失效有什么想法吗?

提前致谢

编辑:已解决

感谢 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);
});

编辑2

您还可以通过将“common”替换为租户的别名来使用特定于您的应用程序/租户的 URL,如下所示:

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

最佳答案

实际的用户 session 由两个不同的组件确定: token 缓存(在 ADAL 的控制下)和系统中可能存在的任何 session 跟踪 Cookie(不在 ADAL 的控制下)。

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

最可靠的方法是不创建任何持久性 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
}
});

关于azure - ADAL:W8.1 应用程序尝试注销用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27061948/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com