Проверьте, есть ли в приложении PasswordVault/ Диспетчер учетных данных данные приложения при загрузке

Эй, я использую PasswordVault для хранения учетных данных пользователя в моем приложении для Windows 8.

То, что я хочу, чтобы приложение делало при загрузке, это проверка, чтобы убедиться, что Менеджер паролей / учетных данных уже имеет сохраненное значение для моего приложения. если это не так, я хочу, чтобы он оставался на странице, чтобы пользователь мог войти в систему, но если учетные данные уже есть, тогда я бы хотел, чтобы он сразу перешел на страницу 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;
    }
}

Проблема заключается в том, что если в Resource (MYapp) не сохранены учетные данные, код:

var credentialList = vault.FindAllByResource("MYapp");

выходы:

Информация WinRT: не удается найти учетные данные в хранилище

Дополнительная информация: Элемент не найден.

2 ответа

Решение

Метод FindAllByResource выдает исключение, когда для указанного ресурса нет учетных данных, поэтому вам нужно обернуть его try catch блок.

В качестве альтернативы вы можете использовать "RetrieveAll", который не выдает исключение, если нет сохраненных учетных данных, и выполняет итерацию по каждому возвращенному PasswordCredential и проверить это Resource имущество.

Я постараюсь ответить на этот вопрос как можно лучше:

Во-первых, как сказал Тадеуш, 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));

Я надеюсь, что этот ответ поможет по порядку, извините за поздний ответ, но я пытался решить эту проблему прямо сейчас, и я подумал, что должен дать более подробный или полный ответ на этот вопрос.

Также вам следует рассмотреть проверку истечения срока действия токена и обработку обновления.

Другие вопросы по тегам