检查PasswordVault /凭证管理器是否在加载时有应用数据

嘿,我正在使用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中找到凭据

附加信息:未找到元素。

方法FindAllByResource在没有指定资源的凭据时抛出exception,因此您需要使用try catch块将其包装起来。

或者,您可以使用’RetrieveAll’,如果没有存储凭据,则不会抛出exception并迭代每个返回的PasswordCredential并检查它的Resource属性。

我尽力尽力回答这个问题:

Firstable如Tadeusz所说,当没有指定资源的凭证时,FindAllByResource会抛出exception,为了不破坏你的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; } 

现在,您所要做的就是在密码保存中存储新令牌

你必须首先登录,然后存储令牌,所以下次你尝试检索你的凭证时,它不会抛出exception,因为它已经存储了。 例如它应该是这样的:

 await client.LoginAsync(provider); 

然后你存储你的令牌像这样:

 PasswordVault.Add(new PasswordCredential("MYapp", client.CurrentUser.UserId, client.CurrentUser.MobileServiceAuthenticationToken)); 

我希望这个答案有助于顺序,对于迟到的答案感到抱歉但是,我发现自己现在正试图解决这个问题,我想我应该对这个问题给出更详细或完整的答案。

您还应该考虑令牌过期检查和刷新处理。