2013-07-30 11 views
5

Hey Sto utilizzando PasswordVault per l'archiviazione delle credenziali utente nell'app di Windows 8.Verifica se PasswordVault/responsabile delle credenziali ha i dati delle app al carico

Quello che voglio che l'app faccia al caricamento è controllare se il PasswordVault/responsabile delle credenziali ha già un valore memorizzato per la mia app. se non lo fanno, non voglio che rimanga sulla pagina in modo che l'utente può effettuare il login, ma se le credenziali sono già lì poi mi vorrei per andare direttamente alla pagina 2.

Ho provato ad utilizzare il seguente codice:

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

e poi al caricamento della pagina ho

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

il problema è che se non v'è alcuna credenziale memorizzato con il Resource (myapp) il codice:

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

rendimenti:

informazioni WinRT: Non riesci a trovare delle credenziali in Vault

Ulteriori informazioni: Elemento non trovato.

risposta

2

Metodo FindAllByResource genera un'eccezione quando non ci sono le credenziali per la risorsa specificata, quindi è necessario avvolgerlo con try catch blocco.

In alternativa è possibile utilizzare 'RetrieveAll' che non genera eccezioni se non ci sono credenziali memorizzate e iterate su ciascuna restituita PasswordCredential e verificare la proprietà Resource.

+0

grazie per la risposta rapida compagno ,,, ho provato a provare e catturare intorno ad esso già, come una delle prime cose, ma ancora getta l'eccezione .. Utilizzando RetrieveAll come troverei la proprietà delle risorse che non può vedere per farlo mostrare .. –

+0

strano, dovrebbe prendere quell'eccezione, puoi aggiornare il tuo codice con try catch? Controlla anche http://social.msdn.microsoft.com/Forums/windowsapps/en-US/33101f6c-479f-4828-9093-f7cbe70464d7/exception-trying-to-find-passwordcredential-in-passwordvault –

+0

Prova a utilizzare la funzione di cattura (Eccezione e) invece di specificare il tipo di eccezione – sLedgem

1

Cercherò di rispondere a questa domanda il meglio che posso:

Firstable come ha detto Tadeusz FindAllByResource genera un'eccezione quando non ci sono le credenziali per la risorsa specificata, al fine di mandare in crash dont voi app, si avrebbe bisogno per avvolgere la logica all'interno di un blocco try-catch.

la ragione per fare questo è che tu sia in grado di creare la tua risorsa nel caso in cui non ne hai uno. in modo che il mio modo di vedere, è la logica dovrebbe essere simile a questo:

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

ora tutto quello che dovete fare è per memorizzare un nuovo token nella vostra PasswordVault

necessario effettuare il login prima e poi si memorizzano i token, quindi la prossima volta che proverai a recuperare le tue credenziali non genererà un'eccezione dal momento che è già archiviata. con l'esempio che dovrebbe essere qualcosa di simile:

await client.LoginAsync(provider); 

allora memorizzare il token in questo modo:

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

Spero che questa risposta aiuta in ordine, mi spiace per il ritardo risposta, ma, mi sono trovato cercando di risolvere questo problema proprio ora e ho pensato di dare una risposta più dettagliata o completa a questa domanda.

Inoltre, è necessario considerare i controlli di scadenza dei token e la gestione aggiornata.

Problemi correlati