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

时间:2013-07-30 17:52:17

标签: c# windows-8 credentials 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中找到凭据

     

其他信息:找不到元素。

2 个答案:

答案 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));

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

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