Хранилище учетных данных для приложений Windows

В этой статье описывается, как приложения Windows могут использовать Хранилище учетных данных для безопасного хранения и получения учетных данных пользователей и перемещения между ними с помощью учетной записи Майкрософт пользователя.

API-интерфейсы среда выполнения Windows (WinRT) для доступа к Учетным данным Locker являются частью пакета SDK для Windows. Эти API были созданы для использования в приложениях универсальная платформа Windows (UWP), но они также могут использоваться в приложениях WinUI или в упакованных классических приложениях, включая WPF и Windows Forms. Дополнительные сведения об использовании API WinRT в классическом приложении Windows см. в статье "Вызов API среда выполнения Windows" в классических приложениях.

Обзор примера сценария

Например, у вас есть приложение, которое подключается к службе для доступа к защищенным ресурсам, таким как файлы мультимедиа или социальные сети. Служба требует сведения о входе для каждого пользователя. Вы встроили пользовательский интерфейс в приложение, которое получает имя пользователя и пароль для пользователя, который затем используется для входа пользователя в службу. Используя API Locker учетных данных, вы можете хранить имя пользователя и пароль для пользователя и легко извлекать их и регистрировать пользователя автоматически при следующем открытии приложения независимо от того, на каком устройстве они включено.

Учетные данные пользователя, хранящиеся в хранилище учетных данных, не затрагиваются ApplicationData.RoamingStorageQuota и не будут удалены из-за неактивности, например традиционных перемещаемых данных. Однако в хранилище учетных данных можно хранить только до 20 учетных данных для каждого приложения.

Хранилище учетных данных работает немного по-другому для учетных записей домена. Если у вас есть учетные данные, хранящиеся в учетной записи Майкрософт, и вы связываете эту учетную запись с учетной записью домена (например, используемой в рабочей учетной записи), учетные данные будут перемещаться в эту учетную запись домена. Однако все новые учетные данные, добавленные при входе в учетную запись домена, не будут перемещаться. Это гарантирует, что частные учетные данные для домена не предоставляются за пределами домена.

Хранение учетных данных пользователя

  1. Получите ссылку на Хранилище учетных данных с помощью объекта PasswordVault из пространства имен Windows.Security.Credentials .
  2. Создайте объект PasswordCredential, содержащий идентификатор приложения, имя пользователя и пароль и передайте его методу PasswordVault.Add, чтобы добавить учетные данные в хранилище.
var vault = new Windows.Security.Credentials.PasswordVault();
vault.Add(new Windows.Security.Credentials.PasswordCredential(
    "My App", username, password));

Получение учетных данных пользователя

У вас есть несколько вариантов получения учетных данных пользователя из Хранилища учетных данных после получения ссылки на объект PasswordVault .

  • Вы можете получить все учетные данные, предоставленные пользователем для приложения в хранилище, с помощью метода PasswordVault.RetrieveAll .
  • Если вы знаете имя пользователя для сохраненных учетных данных, вы можете получить все учетные данные для этого имени пользователя с помощью метода PasswordVault.FindAllByUserName .
  • Если вы знаете имя ресурса для сохраненных учетных данных, вы можете получить все учетные данные для этого имени ресурса с помощью метода PasswordVault.FindAllByResource .
  • Наконец, если вы знаете имя пользователя и имя ресурса для учетных данных, вы можете получить только эти учетные данные с помощью метода PasswordVault.Retrieve .

Давайте рассмотрим пример, в котором мы храним имя ресурса глобально в приложении, и мы автоматически регистрируем пользователя, если мы найдем учетные данные для них. Если мы найдем несколько учетных данных для одного пользователя, мы просим пользователя выбрать учетные данные по умолчанию для использования при входе.

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

Удаление учетных данных пользователя

Удаление учетных данных пользователя в Хранилище учетных данных также является быстрым двухэтапным процессом.

  1. Получите ссылку на Хранилище учетных данных с помощью объекта PasswordVault из пространства имен Windows.Security.Credentials .
  2. Передайте учетные данные, которые необходимо удалить в метод PasswordVault.Remove .
var vault = new Windows.Security.Credentials.PasswordVault();
vault.Remove(new Windows.Security.Credentials.PasswordCredential(
    "My App", username, password));

Рекомендации

Используйте только хранилище учетных данных для паролей, а не для больших больших двоичных объектов данных.

Сохраните пароли в хранилище учетных данных только в том случае, если выполнены следующие условия:

  • Пользователь успешно вошел в систему.
  • Пользователь решил сохранить пароли.

Никогда не сохраняйте учетные данные в виде обычного текста с помощью данных приложения или параметров перемещения.