Compartir a través de


Caja de seguridad de credenciales para aplicaciones de Windows

En este artículo se describe cómo las aplicaciones de Windows pueden usar la caja de seguridad de credenciales para almacenar y recuperar credenciales de usuario de forma segura, y cómo transferirlas entre dispositivos con la cuenta de Microsoft del usuario.

Las API de Windows Runtime (WinRT) para el acceso a Credential Locker forman parte del Kit de desarrollo de software (SDK) de Windows. Estas API se crearon para su uso en aplicaciones de Plataforma universal de Windows (UWP), pero también se pueden usar en aplicaciones winUI o en aplicaciones de escritorio empaquetadas, incluidas WPF y Windows Forms. Para obtener más información sobre el uso de las API de WinRT en la aplicación de escritorio de Windows, consulta Llamar a las API de Windows Runtime en aplicaciones de escritorio.

Información general sobre el escenario de ejemplo

Por ejemplo, tiene una aplicación que se conecta a un servicio para acceder a recursos protegidos, como archivos multimedia o redes sociales. El servicio requiere información de inicio de sesión para cada usuario. Ha integrado la interfaz de usuario en la aplicación que obtiene el nombre de usuario y la contraseña del usuario, que luego se usa para registrar al usuario en el servicio. Con la API de Credential Locker, puede almacenar el nombre de usuario y la contraseña del usuario y recuperarlos fácilmente e iniciar sesión automáticamente el usuario la próxima vez que abra la aplicación, independientemente del dispositivo en el que estén.

Las credenciales de usuario almacenadas en credential Locker no expiran, no se ven afectadas por ApplicationData.RoamingStorageQuota y no se borrarán debido a inactividad como los datos móviles tradicionales. Sin embargo, solo puede almacenar hasta 20 credenciales por aplicación en credential Locker.

Credential Locker funciona de forma ligeramente diferente para las cuentas de dominio. Si hay credenciales almacenadas con su cuenta De Microsoft y asocia esa cuenta a una cuenta de dominio (por ejemplo, la cuenta que usa en el trabajo), las credenciales pasarán a esa cuenta de dominio. Sin embargo, las nuevas credenciales agregadas al iniciar sesión con la cuenta de dominio no se moverán. Esto garantiza que las credenciales privadas del dominio no se expongan fuera del dominio.

Almacenamiento de credenciales de usuario

  1. Obtenga una referencia a Credential Locker mediante el objeto PasswordVault del espacio de nombres Windows.Security.Credentials .
  2. Cree un objeto PasswordCredential que contenga un identificador para la aplicación, el nombre de usuario y la contraseña y páscala al método PasswordVault.Add para agregar la credencial a la caja de seguridad.
var vault = new Windows.Security.Credentials.PasswordVault();
vault.Add(new Windows.Security.Credentials.PasswordCredential(
    "My App", username, password));

Recuperación de credenciales de usuario

Tiene varias opciones para recuperar las credenciales de usuario de Credential Locker después de tener una referencia al objeto PasswordVault .

Echemos un vistazo a un ejemplo en el que hemos almacenado el nombre de recurso globalmente en una aplicación y registramos al usuario automáticamente si encontramos una credencial para ellos. Si encontramos varias credenciales para el mismo usuario, pedimos al usuario que seleccione una credencial predeterminada que se usará al iniciar sesión.

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

Eliminación de credenciales de usuario

La eliminación de credenciales de usuario en Credential Locker también es un proceso rápido y en dos pasos.

  1. Obtenga una referencia a Credential Locker mediante el objeto PasswordVault del espacio de nombres Windows.Security.Credentials .
  2. Pase la credencial que desea eliminar al método PasswordVault.Remove .
var vault = new Windows.Security.Credentials.PasswordVault();
vault.Remove(new Windows.Security.Credentials.PasswordCredential(
    "My App", username, password));

procedimientos recomendados

Use solo la caja de seguridad de credenciales para las contraseñas y no para blobs de datos más grandes.

Guarde las contraseñas en ellocker de credenciales solo si se cumplen los siguientes criterios:

  • El usuario ha iniciado sesión correctamente.
  • El usuario ha optado por guardar contraseñas.

Nunca almacene las credenciales en texto sin formato mediante los datos de la aplicación o la configuración de itinerancia.