7

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

附加信息:未找到元素。

4

2 回答 2

4

FindAllByResource当指定资源没有凭据时,方法会抛出异常,因此您需要用try catch块包装它。

或者,您可以使用'RetrieveAll',如果没有存储凭据并迭代每个返回PasswordCredential并检查它的Resource属性,它不会引发异常。

于 2013-07-30T18:54:12.927 回答
3

我会尽量回答这个问题:

Firstable 正如 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));

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

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

于 2017-05-25T04:23:07.633 回答