嘿我正在使用PasswordVault在我的Windows 8应用程序中存储用户凭据。
我希望应用程序在加载时执行的操作是检查PasswordVault /凭据管理器是否已为我的应用程序存储了值。如果它没有,我希望它留在页面上,以便用户可以登录,但如果凭证已经存在,那么我希望它直接进入第2页。
我尝试使用以下代码:
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中找到凭据
其他信息:找不到元素。
答案 0 :(得分:3)
方法FindAllByResource
在没有指定资源的凭据时抛出异常,因此您需要使用try catch
块包装它。
或者,您可以使用“RetrieveAll”,如果没有存储凭据,则不会抛出异常并迭代每个返回的PasswordCredential
并检查它的Resource
属性。
答案 1 :(得分:2)
我尽可能地尽力回答这个问题:
Firstable正如Tadeusz所说,当没有指定资源的凭证时,FindAllByResource会抛出异常,为了不破坏你的app,你需要在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));
我希望这个答案有助于顺序,对于迟到的答案感到抱歉但是,我发现自己现在正试图解决这个问题,我想我应该对这个问题给出更详细或完整的答案。
此外,您应该考虑令牌过期检查和刷新处理。