检查PasswordVault/credential manager是否加载了应用程序数据

本文关键字:加载 应用程序 数据 是否 manager PasswordVault credential 检查 | 更新日期: 2023-09-27 18:25:29

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

附加信息:找不到元素。

检查PasswordVault/credential manager是否加载了应用程序数据

方法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));

我希望这个答案有助于整理,很抱歉回答得太晚了,但我发现自己现在正在努力解决这个问题,我想我应该对这个问题给出更详细或完整的答案。

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