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

时间:2016-06-24 13:25:08

标签: c# win-universal-app uwp windows-10-universal windows-10-mobile

我在通用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);
        }

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

这在Windows 10中不可用,但将在周年纪念更新中显示:

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

您可以在the MSDN page上看到更多内容,如果您的内部预览版本/ SDK晚于14295,您应该可以对其进行测试。

答案 1 :(得分:1)

请看:

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

描述了删除凭证的功能。

您正在使用的方法public IReadOnlyList<PasswordCredential> RetrieveAll()似乎返回一个只读集合。因此,它的价值不能被删除。

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

如果要删除特定资源名称的所有凭据,则此解决方法即使在较旧的Windows 10版本中也可以使用:

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