7 Stimmen

Überprüfen Sie, ob der PasswordVault/Anmeldeinformations-Manager beim Laden App-Daten hat

Hey, ich verwende PasswordVault zum Speichern von Benutzeranmeldeinformationen in meiner Windows 8-App.

Was ich möchte, dass die App beim Laden macht, ist zu überprüfen, ob der PasswordVault/Anmeldeinformations-Manager bereits einen gespeicherten Wert für meine App hat. Wenn nicht, möchte ich, dass sie auf der Seite bleibt, damit sich der Benutzer anmelden kann. Wenn die Anmeldeinformationen bereits vorhanden sind, möchte ich, dass sie direkt zur Seite 2 geht.

Ich habe versucht, den folgenden Code zu verwenden:

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
            // Benutzer auswählen

    return credential;
}

und dann habe ich auf der Seite folgendes im Page_Loaded:

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;
    }
}

Das Problem ist, dass, wenn keine Anmeldeinformationen mit dem Ressourcennamen (MYapp) gespeichert sind, der Code:

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

folgende Meldung ergibt:

WinRT-Informationen: Kann Anmeldeinformationen im Vault nicht finden

Zusätzliche Informationen: Element nicht gefunden.

4voto

Tadeusz Wójcik Punkte 6167

Methode FindAllByResource wirft eine Ausnahme, wenn keine Anmeldeinformationen für den angegebenen Ressourcen vorhanden sind. Deshalb müssen Sie diese mit einem try catch-Block umgeben.

Alternativ können Sie 'RetrieveAll' verwenden, welches keine Ausnahme wirft, wenn keine Anmeldeinformationen gespeichert sind, und über jedes zurückgegebene PasswordCredential iterieren und dessen Resource-Eigenschaft überprüfen.

3voto

Ich werde versuchen, diese Frage so gut wie möglich zu beantworten:

Erstens, wie Tadeusz sagte, wirft FindAllByResource eine Ausnahme, wenn keine Anmeldeinformationen für die angegebene Ressource vorhanden sind. Um zu verhindern, dass Ihre App abstürzt, müssen Sie Ihre Logik in einen try-catch-Block einbetten.

Der Grund dafür ist, dass Sie Ihre Ressource erstellen können, wenn Sie keine haben. Also meiner Meinung nach sollte Ihre Logik so aussehen:

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($"Fehler beim Abrufen des Tokens: {ex.Message}");
    }
    return null;
}

Jetzt müssen Sie nur noch ein neues Token in Ihrem PasswordVault speichern.

Sie müssen sich zuerst anmelden und dann das Token speichern, damit beim nächsten Versuch, Ihre Anmeldeinformationen abzurufen, keine Ausnahme mehr auftritt, da sie bereits gespeichert sind. Ein Beispiel könnte so aussehen:

await client.LoginAsync(provider);

dann speichern Sie Ihr Token wie folgt:

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

Ich hoffe, diese Antwort hilft weiter. Entschuldigung für die späte Antwort, aber ich versuche gerade, dieses Problem zu lösen, und dachte, ich sollte eine detailliertere oder umfassendere Antwort auf diese Frage geben.

Sie sollten auch die Token-Ablaufüberprüfungen und das Aktualisierungsmanagement in Betracht ziehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X