Casella di sicurezza delle credenziali

Questo articolo descrive in che modo le app UWP (Universal Windows Platform) possono usare il Locker delle credenziali per archiviare e recuperare in modo sicuro le credenziali utente ed eseguirne il roaming tra i dispositivi con l'account Microsoft dell'utente.

Ad esempio, si dispone di un'app che si connette a un servizio per accedere a risorse protette, ad esempio file multimediali o social networking. Il servizio richiede informazioni di accesso per ogni utente. Si è integrata l'interfaccia utente nell'app che ottiene il nome utente e la password per l'utente, che viene quindi usato per registrare l'utente nel servizio. Usando l'API Locker delle credenziali, è possibile archiviare il nome utente e la password per l'utente e recuperarli facilmente e registrare automaticamente l'utente alla successiva apertura dell'app, indipendentemente dal dispositivo in cui si trovano.

Le credenziali utente archiviate in CredentialLocker non scadono, non sono influenzate da ApplicationData.RoamingStorageQuota e non saranno cancellate a causa di inattività come i dati mobili tradizionali. Tuttavia, è possibile archiviare fino a 20 credenziali per ogni app in CredentialLocker.

Il locker delle credenziali funziona in modo leggermente diverso per gli account dominio. Se sono presenti credenziali archiviate con l'account Microsoft e si associa tale account a un account dominio (ad esempio l'account usato al lavoro), le credenziali verranno sottoposte a roaming all'account di dominio. Tuttavia, tutte le nuove credenziali aggiunte quando è stato eseguito l'accesso con l'account di dominio non verranno sottoposte a roaming. In questo modo, le credenziali private per il dominio non vengono esposte all'esterno del dominio.

Archiviare le credenziali utente

  1. Ottenere un riferimento a Credential Locker usando l'oggetto PasswordVault dallo spazio dei nomi Windows.Security.Credentials.
  2. Creare un oggetto PasswordCredential contenente un identificatore per l'app, il nome utente e la password e passarlo al metodo PasswordVault.Add per aggiungere le credenziali al locker.
var vault = new Windows.Security.Credentials.PasswordVault();
vault.Add(new Windows.Security.Credentials.PasswordCredential(
    "My App", username, password));

Recupero delle credenziali utente

Sono disponibili diverse opzioni per recuperare le credenziali utente da Credential Locker dopo aver ottenuto un riferimento all'oggetto PasswordVault.

  • È possibile recuperare tutte le credenziali fornite dall'utente per l'app nella casella di sicurezza con il metodo PasswordVault.RetrieveAll.

  • Se si conosce il nome utente per le credenziali archiviate, è possibile recuperare tutte le credenziali per tale nome utente con il metodo PasswordVault.FindAllByUserName.

  • Se si conosce il nome della risorsa per le credenziali archiviate, è possibile recuperare tutte le credenziali per tale nome di risorsa con il metodo PasswordVault.FindAllByResource.

  • Infine, se si conoscono sia il nome utente che il nome della risorsa per una credenziale, è possibile recuperare solo tale credenziale con il metodo PasswordVault.Retrieve.

Si esaminerà ora un esempio in cui è stato archiviato il nome della risorsa a livello globale in un'app e l'utente viene registrato automaticamente se vengono trovate credenziali. Se vengono trovate più credenziali per lo stesso utente, viene chiesto all'utente di selezionare una credenziale predefinita da usare durante l'accesso.

private string resourceName = "My App";
private string defaultUserName;

private void Login()
{
    var loginCredential = GetCredentialFromLocker();

    if (loginCredential != null)
    {
        // There is a credential stored in the locker.
        // Populate the Password property of the credential
        // for automatic login.
        loginCredential.RetrievePassword();
    }
    else
    {
        // There is no credential stored in the locker.
        // Display UI to get user credentials.
        loginCredential = GetLoginCredentialUI();
    }

    // Log the user in.
    ServerLogin(loginCredential.UserName, loginCredential.Password);
}


private Windows.Security.Credentials.PasswordCredential GetCredentialFromLocker()
{
    Windows.Security.Credentials.PasswordCredential credential = null;

    var vault = new Windows.Security.Credentials.PasswordVault();

    IReadOnlyList<PasswordCredential> credentialList = null;

    try
    {
        credentialList = vault.FindAllByResource(resourceName);
    }
    catch(Exception)
    {
        return null;
    }

    if (credentialList.Count > 0)
    {
        if (credentialList.Count == 1)
        {
            credential = credentialList[0];
        }
        else
        {
            // When there are multiple usernames,
            // retrieve the default username. If one doesn't
            // exist, then display UI to have the user select
            // a default username.

            defaultUserName = GetDefaultUserNameUI();

            credential = vault.Retrieve(resourceName, defaultUserName);
        }
    }

    return credential;
}

Eliminare le credenziali utente

L'eliminazione delle credenziali utente in Credential Locker è anche un processo rapido in due passaggi.

  1. Ottenere un riferimento a Credential Locker usando l'oggetto PasswordVault dallo spazio dei nomi Windows.Security.Credentials.

  2. Passare le credenziali da eliminare al metodo PasswordVault.Remove.

var vault = new Windows.Security.Credentials.PasswordVault();
vault.Remove(new Windows.Security.Credentials.PasswordCredential(
    "My App", username, password));

Procedure consigliate

Usare solo la casella di sicurezza delle credenziali per le password e non per i blob di dati di dimensioni maggiori.

Salvare le password nel locker delle credenziali solo se vengono soddisfatti i criteri seguenti:

  • L'utente ha eseguito l'accesso.
  • L'utente ha scelto di salvare le password.

Non archiviare mai le credenziali in testo normale usando i dati dell'app o le impostazioni mobili.