C# 检查PasswordVault/credential manager是否加载了应用程序数据
嘿,我正在使用PasswordVault在我的windows 8应用程序中存储用户凭据 我希望应用程序在加载时执行的操作是检查PasswordVault/credential manager是否已经为我的应用程序存储了值。如果没有,我希望它留在页面上,以便用户可以登录,但如果凭据已经存在,那么我希望它直接转到第2页 我尝试使用以下代码:C# 检查PasswordVault/credential manager是否加载了应用程序数据,c#,windows-8,credentials,passwordvault,C#,Windows 8,Credentials,Passwordvault,嘿,我正在使用PasswordVault在我的windows 8应用程序中存储用户凭据 我希望应用程序在加载时执行的操作是检查PasswordVault/credential manager是否已经为我的应用程序存储了值。如果没有,我希望它留在页面上,以便用户可以登录,但如果凭据已经存在,那么我希望它直接转到第2页 我尝试使用以下代码: private Windows.Security.Credentials.PasswordCredential GetCredentialFromLocker(
private Windows.Security.Credentials.PasswordCredential GetCredentialFromLocker()
{
Windows.Security.Credentials.PasswordCredential credential = null;
var vault = new Windows.Security.Credentials.PasswordVault();
var credentialList = vault.FindAllByResource("MYapp");
if (credentialList.Count > 0)
if (credentialList.Count == 1)
credential = credentialList[0];
else
// User selecor
return credential;
}
然后在页面加载时,我有
private void Page_Loaded(object sender, RoutedEventArgs e)
{
var loginCredential = GetCredentialFromLocker();
if (loginCredential != null)
this.Frame.Navigate(typeof(page2));
else
{
loginBigButton.Visibility = Windows.UI.Xaml.Visibility.Visible;
signUpButton.Visibility = Windows.UI.Xaml.Visibility.Visible;
signUpTextBlock.Visibility = Windows.UI.Xaml.Visibility.Visible;
}
}
问题在于,如果资源(MYapp)中没有存储凭据,则代码:
var credentialList = vault.FindAllByResource("MYapp");
收益率:
WinRT信息:在Vault中找不到凭据
其他信息:未找到元素
方法
FindAllByResource
在没有指定资源的凭据时引发异常,因此需要使用try-catch
块对其进行包装
或者,您可以使用“RetrieveAll”,如果没有存储凭据,它不会引发异常,并对每个返回的
PasswordCredential
进行迭代,检查它的Resource
属性。我将尽力回答这个问题:
首先,正如Tadeusz所说,FindAllByResource在没有指定资源的凭据时抛出异常,为了不使应用程序崩溃,您需要将您的逻辑包装在try-catch块中
这样做的原因是为了在没有资源的情况下创建资源。在我看来,你的逻辑应该是这样的:
private Windows.Security.Credentials.PasswordCredential GetCredentialFromLocker()
{
Windows.Security.Credentials.PasswordCredential credential = null;
var vault = new Windows.Security.Credentials.PasswordVault();
try
{
var credential = vault.FindAllByResource("MYapp").FirstOrDefault();
return credential;
}
catch(Exception ex)
{
Debug.WriteLine($"Error retrieving Token: {ex.Message}");
}
return null;
}
await client.LoginAsync(provider);
PasswordVault.Add(new PasswordCredential("MYapp",
client.CurrentUser.UserId,
client.CurrentUser.MobileServiceAuthenticationToken));
现在,您只需在passwordvault中存储一个新令牌
您必须首先登录,然后存储令牌,因此下次尝试检索凭据时,它不会抛出异常,因为它已经存储了。
举例来说,它应该是这样的:
private Windows.Security.Credentials.PasswordCredential GetCredentialFromLocker()
{
Windows.Security.Credentials.PasswordCredential credential = null;
var vault = new Windows.Security.Credentials.PasswordVault();
try
{
var credential = vault.FindAllByResource("MYapp").FirstOrDefault();
return credential;
}
catch(Exception ex)
{
Debug.WriteLine($"Error retrieving Token: {ex.Message}");
}
return null;
}
await client.LoginAsync(provider);
PasswordVault.Add(new PasswordCredential("MYapp",
client.CurrentUser.UserId,
client.CurrentUser.MobileServiceAuthenticationToken));
然后按如下方式存储令牌:
private Windows.Security.Credentials.PasswordCredential GetCredentialFromLocker()
{
Windows.Security.Credentials.PasswordCredential credential = null;
var vault = new Windows.Security.Credentials.PasswordVault();
try
{
var credential = vault.FindAllByResource("MYapp").FirstOrDefault();
return credential;
}
catch(Exception ex)
{
Debug.WriteLine($"Error retrieving Token: {ex.Message}");
}
return null;
}
await client.LoginAsync(provider);
PasswordVault.Add(new PasswordCredential("MYapp",
client.CurrentUser.UserId,
client.CurrentUser.MobileServiceAuthenticationToken));
我希望这个答案能对你有所帮助,很抱歉回答得太晚,但我发现自己现在正试图解决这个问题,我想我应该给这个问题一个更详细或完整的答案
你也应该考虑令牌过期检查和刷新处理。
谢谢快速回复队友,我试着试着抓住它,作为第一件事之一,但是它仍然抛出了异常。使用RetrieveAll如何找到它看不到的资源属性以使其显示..奇怪的是,它应该捕获该异常,您可以使用try-catch更新代码吗?另外,请检查Try using catch(异常e),而不是指定异常类型。尽管使用Try/catch,我也会得到一个异常。您找到解决方案了吗?我在vault.FindAllByResource(“MYapp”).FirstOrDefault()方面遇到问题代码>有时从某些PC上,即使资源存在,它也会抛出一个异常,指出资源不存在。可能吗?我能做些什么来防止它?我在vault.FindAllByResource(“MYapp”).FirstOrDefault()中遇到问题代码>有时从某些PC上,即使资源存在,它也会抛出一个异常,指出资源不存在。可能吗?我能做些什么来防止它?我想知道是否有人知道密码字段的大小限制?