Проверьте, есть ли в приложении 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));
Я надеюсь, что этот ответ поможет по порядку, извините за поздний ответ, но я пытался решить эту проблему прямо сейчас, и я подумал, что должен дать более подробный или полный ответ на этот вопрос.
Также вам следует рассмотреть проверку истечения срока действия токена и обработку обновления.