Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查PasswordVault/credential manager是否加载了应用程序数据_C#_Windows 8_Credentials_Passwordvault - Fatal编程技术网

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

C# 检查PasswordVault/credential manager是否加载了应用程序数据,c#,windows-8,credentials,passwordvault,C#,Windows 8,Credentials,Passwordvault,嘿,我正在使用PasswordVault在我的windows 8应用程序中存储用户凭据 我希望应用程序在加载时执行的操作是检查PasswordVault/credential manager是否已经为我的应用程序存储了值。如果没有,我希望它留在页面上,以便用户可以登录,但如果凭据已经存在,那么我希望它直接转到第2页 我尝试使用以下代码: private Windows.Security.Credentials.PasswordCredential GetCredentialFromLocker(

嘿,我正在使用PasswordVault在我的windows 8应用程序中存储用户凭据

我希望应用程序在加载时执行的操作是检查PasswordVault/credential manager是否已经为我的应用程序存储了值。如果没有,我希望它留在页面上,以便用户可以登录,但如果凭据已经存在,那么我希望它直接转到第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
在没有指定资源的凭据时引发异常,因此需要使用
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));
现在,您只需在passwordvault中存储一个新令牌

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

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));
然后按如下方式存储令牌:

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));
我希望这个答案能对你有所帮助,很抱歉回答得太晚,但我发现自己现在正试图解决这个问题,我想我应该给这个问题一个更详细或完整的答案


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

谢谢快速回复队友,我试着试着抓住它,作为第一件事之一,但是它仍然抛出了异常。使用RetrieveAll如何找到它看不到的资源属性以使其显示..奇怪的是,它应该捕获该异常,您可以使用try-catch更新代码吗?另外,请检查Try using catch(异常e),而不是指定异常类型。尽管使用Try/catch,我也会得到一个异常。您找到解决方案了吗?我在vault.FindAllByResource(“MYapp”).FirstOrDefault()方面遇到问题有时从某些PC上,即使资源存在,它也会抛出一个异常,指出资源不存在。可能吗?我能做些什么来防止它?我在vault.FindAllByResource(“MYapp”).FirstOrDefault()中遇到问题有时从某些PC上,即使资源存在,它也会抛出一个异常,指出资源不存在。可能吗?我能做些什么来防止它?我想知道是否有人知道密码字段的大小限制?