2013-07-30 42 views
5

嘿,我正在使用PasswordVault将用户凭证存储在我的Windows 8应用程序中。检查PasswordVault /凭证管理器是否在加载应用数据

我希望应用程序在加载时执行的操作是检查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的信息:不能在跳马

找到凭据的其他信息:找不到元素。

回答

2

方法FindAllByResource抛出异常,当有对指定的资源没有凭据,所以你需要用try catch块包裹。

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

+0

感谢您的快速回复队友,,,我尝试了试一试,并将其作为第一件事情之一,但它仍然抛出异常。使用RetrieveAll我如何找到它不能看到的资源属性让它显示.. –

+0

奇怪,它应该捕获该异常,你可以用try catch更新你的代码吗?另请参阅http://social.msdn.microsoft.com/Forums/windowsapps/en-US/33101f6c-479f-4828-9093-f7cbe70464d7/exception-trying-to-find-passwordcredential-in-passwordvault –

+0

尝试使用catch(异常e)而不是指定异常类型 – sLedgem

1

我会尽力回答这个问题最好的,因为我可以:

Firstable为塔德乌什说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; 
} 

现在所有你需要做的就是存储新令牌的passwordvault

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

await client.LoginAsync(provider); 

然后存储您的令牌是这样的:

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

我希望这个答案可以帮助才能,遗憾的答案晚,但我发现自己试图解决这个问题,我想我应该给这个问题更详细或完整的答案。

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

相关问题