我在通用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);
}
有什么建议吗?
答案 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);
}
}