Condividi tramite


Locker delle credenziali per le app di Windows

Questo articolo descrive come le app di Windows possono usare Credential Locker per archiviare e recuperare in modo sicuro le credenziali utente ed eseguirne il roaming tra i dispositivi con l'account Microsoft dell'utente.

Le API Windows Runtime (WinRT) per l'accesso a Credential Locker fanno parte di Windows Software Development Kit (SDK). Queste API sono state create per l'uso nelle app UWP (piattaforma UWP (Universal Windows Platform)), ma possono essere usate anche nelle app WinUI o nelle app desktop in pacchetto, tra cui WPF e Windows Form. Per altre informazioni sull'uso delle API WinRT nell'app desktop di Windows, vedi Chiamare le API di Windows Runtime nelle app desktop.

Panoramica dello scenario di esempio

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. Hai integrato l'interfaccia utente nella tua 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 Credential Locker non scadono, non sono interessate da ApplicationData.RoamingStorageQuota e non verranno cancellate a causa di inattività come i dati mobili tradizionali. Tuttavia, è possibile archiviare fino a 20 credenziali per ogni app in Credential Locker.

Credential Locker funziona in modo leggermente diverso per gli account di 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.