Cofre de Credenciais: Sua solução para lidar com nomes de usuário e senhas no seu aplicativo da Windows Store

Você ainda não ouviu falar sobre o Cofre de Credenciais que está disponível para os aplicativos da Windows Store? Então, está mais do que na hora. Por quê? Porque ele não apenas simplifica a tarefa de armazenar e recuperar as credenciais do usuário, ele as armazena de forma segura, e as credenciais acompanham os usuários "gratuitamente" com a conta da Microsoft.

Vamos supor que você tenha um aplicativo que se conecte a um serviço para acessar recursos protegidos, como arquivos de mídia, rede social etc. O seu serviço exige informações de logon para cada usuário. Portanto, você incorporou a interface do usuário no seu aplicativo, que obtém o nome de usuário e a senha para o usuário, que são usados para fazer o logon do usuário no serviço. Tudo funciona perfeitamente.

Agora você deseja facilitar mais as coisas para os usuários e armazenar suas informações de logon de forma segura para que não precisem fazer logon toda vez que usarem o seu aplicativo. Insira o Cofre de Credenciais. Com apenas algumas chamadas simples para a API do Cofre de Credenciais, você pode armazenar o nome de usuário e a senha para o usuário e recuperá-los facilmente para fazer o logon do usuário na próxima vez que ele abrir o seu aplicativo.

Armazenamento seguro

A excelente vantagem que o Cofre de Credenciais oferece ao seu aplicativo é armazenar as credenciais do usuário em um local seguro, e essas informações são criptografadas quando armazenadas em disco. Você com certeza poderia armazenar as credenciais dos seus usuários em um arquivo no armazenamento local do seu aplicativo, mas armazená-las em texto sem formatação apresenta uma falha de segurança considerável. Se o sistema de um usuário for comprometido de alguma forma, o nome de usuário e senha dele poderão ser facilmente acessados e manipulados. Armazenando o nome de usuário e a senha com o Cofre de Credenciais, o máximo que uma fonte mal-intencionada poderia conseguir capturar seria um arquivo criptografado.

O Cofre de Credenciais é exclusivo para cada usuário do PC do Windows, e o acesso a uma credencial é limitado ao aplicativo armazenado nela. Isto é, você somente pode recuperar uma credencial que tiver armazenado para o seu aplicativo. Da mesma forma, nenhum outro aplicativo poderá obter as credenciais que o seu aplicativo tiver armazenado no cofre.

Credenciais móveis

Um benefício adicional para os seus usuários é que, quando você armazena o nome de usuário e a senha dele usando o Cofre de Credenciais, as credenciais armazenadas acompanham a conta da Microsoft dele em qualquer outro computador confiável usado por ele com essa conta da Microsoft. Isso torna o seu aplicativo seguro ainda mais prático para os seus usuários porque o seu aplicativo fará o logon deles automaticamente — sem solicitar as credenciais novamente — de qualquer computador confiável em que eles tiverem instalado o seu aplicativo e associado a sua conta da Microsoft.

As coisas funcionam um pouco diferente em contas de domínio. Se houver credenciais armazenadas com a sua conta da Microsoft e você associar essa conta a uma conta de domínio (como a conta que você usa no trabalho), as suas credenciais serão transferidas para essa conta de domínio. No entanto, quaisquer novas credenciais adicionadas enquanto o usuário estiver conectado com a conta de domínio não serão transferidas. Isso garante que as credenciais privadas do domínio não sejam expostas fora do domínio.

Armazenando as credenciais do usuário

Armazenar as credenciais do usuário no Cofre de Credenciais é um processo rápido de duas etapas. Primeiro, você obtém uma referência para o Cofre de Credenciais usando o objeto PasswordVault no namespace Windows.Security.Credentials. Depois, você cria um objeto PasswordCredential com um identificador do seu aplicativo, o nome de usuário e a senha, e transfere isso para o método PasswordVault.Add() para adicionar a credencial ao cofre.

C#

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

JavaScript

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

Recuperando as credenciais do usuário

Há várias opções para recuperar as credenciais do usuário do Cofre de Credenciais depois de obter uma referência ao objeto PasswordVault.

  • Você pode recuperar todas as credenciais fornecidas pelo usuário para o seu aplicativo no cofre com o método PasswordVault.RetrieveAll().
  • Se souber o nome de usuário das credenciais armazenadas, você poderá recuperar todas as credenciais desse nome de usuário com o método PasswordVault.FindAllByUserName().
  • Se souber o nome do recurso das credenciais armazenadas, você poderá recuperar todas as credenciais do nome desse recurso com o método PasswordVault.FindAllByResource().
  • Se souber o nome de usuário e o nome do recurso de uma credencial, você 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 fazemos o logon do usuário automaticamente se localizarmos uma credencial para ele. No caso de localizarmos várias credenciais do usuário, solicitamos que o usuário selecione uma credencial padrão para usar ao fazer logon.

C#

 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();
    var credentialList = vault.FindAllByResource(resourceName);
    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;
}

JavaScript

 var resourceName = "My App";
var defaultUserName;

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


function GetCredentialFromLocker() {
    var credential = null;

    var vault = new Windows.Security.Credentials.PasswordVault();
    var credentialList = vault.findAllByResource(resourceName);
    if (credentialList.length > 0) {
        if (credentialList.length == 1) {
            credential = credentialList[0];
        } else {
            // When there are multiple usernames,
            // retrieve the default username. If one doesn’t
            // exist, display UI to have the user select
            // a default username.

            defaultUserName = getDefaultUserNameUI();
            credential = vault.retrieve(resourceName, defaultUserName);
        }
    }

    return credential;
}

Excluindo credenciais do usuário

Excluir as credenciais do usuário no Cofre de Credenciais também é um processo rápido de duas etapas. Novamente, você obtém uma referência para o Cofre de Credenciais usando o objeto PasswordVault no namespace Windows.Security.Credentials. Depois, você passa a credencial que deseja excluir para o método PasswordVault.Remove().

C#

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

JavaScript

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

Fácil e seguro

Como você pode ver, o Cofre de Credenciais é um recurso fácil de usar que simplifica a sua tarefa de autenticar usuários e armazenar as credenciais deles para uso futuro, tudo de uma forma altamente segura.

Outros tópicos de autenticação de aplicativos do Windows 8 incluem o agente de autenticação da Web, que você pode usar para recuperar um token de autenticação de um site (por exemplo, OAuth) e a personalização do seu aplicativo com base na conta da Microsoft de um usuário.

Para obter mais informações, consulte

--Doug Rothaus, desenvolvedor de conteúdo sênior, Conteúdo para desenvolvedores do Windows

Agradecimentos especiais para Yashar Bahman por sua ajuda e contribuições para esta postagem.