2013-07-30 3 views
5

Hey Ich benutze PasswordVault zum Speichern von Benutzeranmeldeinformationen in meiner Windows 8 App.Überprüfen Sie, ob der PasswordVault/Anmeldeinformationsmanager App-Daten zum Laden hat

Ich möchte, dass die App beim Laden überprüft, ob der PasswordVault/Anmeldeinformationsmanager bereits einen gespeicherten Wert für meine App hat. Wenn nicht, möchte ich, dass es auf der Seite bleibt, damit sich der Benutzer anmelden kann, aber wenn die Anmeldeinformationen bereits vorhanden sind, möchte ich direkt zu Seite 2 gehen.

Ich habe Folgendes versucht Code:

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

und dann auf Seite Last ich habe

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 es keine Berechtigung mit der Ressource (myApp) der Code gespeichert:

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

ergibt:

WinRT Informationen: Element nicht gefunden: Kann nicht Credential in Vault

Weitere Informationen finden.

Antwort

2

Methode FindAllByResource wirft Ausnahme, wenn es keine Berechtigungsnachweise für bestimmte Ressource sind, so dass Sie es mit try catch Block wickeln müssen.

Alternativ können Sie 'RetrieveAll' verwenden, das keine Ausnahme auslöst, wenn keine Anmeldeinformationen gespeichert sind, und über jede zurückgegebene PasswordCredential iterieren und ihre Resource Eigenschaft überprüfen.

+0

danke für die schnelle Antwort mate ,,, habe ich versucht, einen Versuch zu versuchen und um es bereits zu fangen, als eines der ersten Dinge, aber es wirft immer noch die Ausnahme .. Mit RetrieveAll, wie würde ich die Resource-Eigenschaft finden es nicht gesehen um es zu zeigen .. –

+0

seltsam, sollte es die Ausnahme fangen, können Sie Ihren Code mit try fangen? Überprüfen Sie auch http://social.msdn.microsoft.com/Forums/windowsapps/en-US/33101f6c-479f-4828-9093-f7cbe70464d7/exception-trying-to-find-passwordcredential-in-passwordvault –

+0

Versuchen Sie mit Fang (Ausnahme e) Anstatt den Ausnahmetyp – sLedgem

1

Ich werde versuchen, diese Frage zu beantworten am besten, wie ich kann:

Firstable als Tadeusz sagte FindAllByResource eine Ausnahme auslöst, wenn es keine Berechtigungsnachweise für bestimmte Ressource sind, um Ihnen App nicht abstürzen, würden Sie brauchen, um Ihre Logik in einen try-catch-Block zu bringen.

Der Grund dafür ist, dass Sie in der Lage sind, Ihre Ressource zu erstellen, falls Sie keine haben. so wie ich es sehe, Logik, die Sie sollte wie folgt 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($"Error retrieving Token: {ex.Message}"); 
    } 
    return null; 
} 

jetzt alles, was Sie tun müssen, ist ein neues Token in Ihrem passwordvault speichern

Sie müssen sich anmelden und dann speichern Sie die token, so dass beim nächsten Mal, wenn Sie versuchen, Ihre Anmeldeinformationen abzurufen, keine Ausnahme ausgelöst wird, da bereits ein Speicher vorhanden ist. mit gutem Beispiel sollte es so etwas wie dieses:

await client.LoginAsync(provider); 

dann speichern Sie Ihre Token wie folgt aus:

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

ich diese Antwort um, sorry für die späte Antwort hilft hoffen aber, fand ich mich versuchen, dieses Problem jetzt zu lösen, und ich dachte, ich sollte eine ausführlichere oder vollständige Antwort auf diese Frage geben.

Auch sollten Sie prüfen Token Ablaufprüfungen und erfrischende Behandlung.

Verwandte Themen