清除存储在通用 Windows 应用程序中的凭据

Clear Credentials stored in Universal Windows App

我在通用 Windows 平台 (UWP) 中使用 Windows.Web.Http.HttpClient。 URL 需要域凭据 (NTLM),因此 windows 打开用户名和密码的自定义弹出窗口。应用程序需要注销功能,但我无法找到可以清除 UWP 存储的凭据的工作代码。

我尝试使用以下代码从 Windows.Security.Credentials.PasswordVault 中清除凭据,但没有成功:

        var cred = new Windows.Security.Credentials.PasswordVault(); 
        var pwds = cred.RetrieveAll();
        foreach(var pwd in pwds)
        {
            pwd.RetrievePassword();                 
            cred.Remove(pwd);
        }

我也在清除以下 cookie:

        var filter = new HttpBaseProtocolFilter();            
        var cookieManager = filter.CookieManager;
        HttpCookieCollection cookies = cookieManager.GetCookies(uri);            
        foreach (HttpCookie u in cookies)
        {
            cookieManager.DeleteCookie(u);
        }

有什么建议吗?

这在 Windows 10 中不可用,但会在周年更新中:

var filter = new HttpBaseProtocolFilter();
filter.ClearAuthenticationCache();

您可以在 the MSDN page 上看到更多信息,如果您拥有晚于 14295 的 Insider Preview 版本/SDK,您应该能够对其进行测试。

请看:

https://docs.microsoft.com/en-us/windows/uwp/security/credential-locker#deleting-user-credentials

描述了删除凭据的功能。

您正在使用的 public IReadOnlyList<PasswordCredential> RetrieveAll() 方法 return 似乎是一个只读集合。因此无法删除其值。

尝试访问凭据,例如public PasswordCredential Retrieve(String resource, String userName)。 return 类型不是只读的,应该允许您使用删除方法。

如果您想删除特定资源名称的所有凭据,此解决方法甚至适用于较早的 Windows10 版本:

private void RemoveAllCredentials(PasswordVault passwordVault)
    {
        //Get all credentials.
        List<PasswordCredential> passwordCredentials = new List<PasswordCredential>();
        var credentials = passwordVault.RetrieveAll();
        foreach (PasswordCredential credential in credentials)
        {
            if (credential.Resource.Equals("ResourceName"))
            {
                passwordCredentials.Add(
                    passwordVault.Retrieve(credential.Resource, credential.UserName));
            }
        }
        foreach (PasswordCredential entry in passwordCredentials)
        {
            passwordVault.Remove(entry);
        }
    }