Compartilhar via


Cofre de credenciais para aplicativos do Windows

Este artigo descreve como os aplicativos do Windows podem usar o Cofre de Credenciais para armazenar e recuperar credenciais de usuário com segurança e transferi-las entre dispositivos com a conta da Microsoft do usuário.

As APIs do WinRT (Tempo de Execução do Windows) para acesso ao Cofre de Credenciais fazem parte do SDK (Software Development Kit) do Windows. Essas APIs foram criadas para uso em aplicativos UWP (Plataforma Universal do Windows), mas também podem ser usadas em aplicativos WinUI ou em aplicativos da área de trabalho empacotados, incluindo WPF e Windows Forms. Para obter mais informações sobre como usar APIs do WinRT em seu aplicativo da área de trabalho do Windows, consulte Chamar APIs do Tempo de Execução do Windows em aplicativos da área de trabalho.

Visão geral do cenário de exemplo

Por exemplo, você possui um aplicativo que se conecta a um serviço para acessar recursos protegidos, como arquivos de mídia ou rede social. O seu serviço requer informações de logon para cada usuário. Você criou a interface do usuário em seu aplicativo que obtém o nome de usuário e a senha do usuário, que são usados para fazer logon do usuário no serviço. Usando a API do Cofre de credenciais, você pode armazenar o nome do usuário e a senha do seu usuário e recuperá-los com facilidade e fazer logon do usuário automaticamente na próxima vez em que ele abrir o aplicativo, independentemente do aplicativo em que ele está.

As credenciais do usuário armazenadas no Cofre de Credenciais não expiram, não são afetadas pelo ApplicationData.RoamingStorageQuota e não serão apagadas devido à inatividade, como dados móveis tradicionais. No entanto, você só pode armazenar até 20 credenciais por aplicativo no Cofre de Credenciais.

O Cofre de Credenciais funciona de maneira um pouco diferente para contas de domínio. Se houver credenciais armazenadas à sua conta da Microsoft e você associar essa conta a uma conta de domínio (como a conta que você usa no trabalho), suas credenciais se moverão para essa conta de domínio. No entanto, quaisquer credenciais novas adicionadas ao se conectar à conta de domínio não se moverão. Isso garante que as credenciais privadas do domínio não sejam expostas fora do domínio.

Armazenando credenciais do usuário

  1. Obtenha uma referência para o Cofre de credenciais usando o objeto PasswordVault do namespace Windows.Security.Credentials.
  2. Crie um objeto PasswordCredential que contenha um identificador para o seu aplicativo, o nome de usuário e a senha, e passe isso para o método PasswordVault.Add para adicionar a credencial ao cofre.
var vault = new Windows.Security.Credentials.PasswordVault();
vault.Add(new Windows.Security.Credentials.PasswordCredential(
    "My App", username, password));

Recuperando credenciais do usuário

Você tem várias opções para recuperar credenciais do usuário do Cofre de credenciais depois que tiver uma referência para o objeto PasswordVault.

  • É possível recuperar todas as credenciais do usuário fornecidas para o seu aplicativo no cofre com o método PasswordVault.RetrieveAll.
  • Se você souber o nome do usuário para as credenciais armazenadas, poderá recuperar todas elas para esse nome de usuário com o método PasswordVault.FindAllByUserName.
  • Se você souber o nome do recurso para as credenciais armazenadas, poderá recuperar todas elas para esse nome de recurso com o método PasswordVault.FindAllByResource.
  • Finalmente, se você souber o nome do usuário e o nome do recurso de uma credencial, poderá recuperar apenas essa credencial, com o método PasswordVault.Retrieve.

Vejamos um exemplo em que armazenamos o nome do recurso globalmente em um aplicativo e faremos logon automaticamente do usuário se encontrarmos uma credencial para ele. No caso de encontrarmos várias credenciais para o mesmo usuário, pediremos a ele para selecionar uma credencial padrão a ser usada ao fazer logon.

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

Excluindo credenciais do usuário

Eliminar credenciais do usuário no Cofre de credenciais é um processo rápido em duas etapas.

  1. Obtenha uma referência para o Cofre de credenciais usando o objeto PasswordVault do namespace Windows.Security.Credentials.
  2. Passe a credencial a ser excluída para o método PasswordVault.Remove.
var vault = new Windows.Security.Credentials.PasswordVault();
vault.Remove(new Windows.Security.Credentials.PasswordCredential(
    "My App", username, password));

Práticas recomendadas

Use o cofre de credenciais para senhas e não para blobs de dados maiores.

Salve senhas no cofre de credenciais somente se os seguintes critérios forem atendidos:

  • O usuário entrou com êxito.
  • O usuário optou por salvar senhas.

Nunca armazene credenciais em texto sem formatação usando dados de aplicativo ou configurações de roaming.