Хранилище учетных данных — удобное решение для обработки имен пользователей и паролей в вашем приложении Магазина Windows

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

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

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

Безопасное хранилище

Важное преимущество использования хранилища учетных данных в ваших приложениях заключается в том, что оно позволяет хранить учетные данные пользователя в безопасном месте, причем учетные данные шифруются при записи на диск. Разумеется, вы могли бы хранить учетные данные пользователя для вашего приложения в файле в локальном хранилище, но хранение учетных данных в текстовом формате связано с серьезным риском для безопасности. Если система пользователя каким-либо образом подвергнута опасности, злоумышленнику легко получить доступ к имени пользователя и паролю и использовать их в своих целях. Если имя пользователя и пароль хранятся с использованием хранилища учетных данных, злоумышленник получит только зашифрованный файл.

Хранилище учетных данных является уникальным для каждого пользователя компьютера с Windows. Доступ к учетным данным имеет только приложение, сохранившее их. То есть вы можете получить только те учетные данные, которые сохранили для вашего приложения. Никакие другие приложения не могут получить доступ к учетным данным, помещенным в хранилище вашим приложением.

Перемещение учетных данных

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

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

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

Сохранение учетных данных пользователя в хранилище учетных данных — быстрый процесс, состоящий из двух этапов. Сначала вы получаете ссылку на хранилище учетных данных, используя объект PasswordVault из пространства имен Windows.Security.Credentials. Затем вы создаете объект PasswordCredential, содержащий идентификатор для вашего приложения, имя пользователя и пароль, и передаете эту информацию методу PasswordVault.Add(), чтобы добавить эти учетные данные в хранилище.

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

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

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

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

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

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

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

Удаление учетных данных пользователя из хранилища учетных данных также является быстрым процессом, выполняемым в два этапа. Вы получаете ссылку на хранилище учетных данных с использованием объекта PasswordVault из пространства имен Windows.Security.Credentials. Затем вы передаете учетные данные, которые требуется удалить, методу 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));

Просто и безопасно

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

Среди других средств проверки подлинности в приложениях для Windows 8 можно назвать брокер веб-проверки подлинности, который можно использовать для извлечения маркера проверки подлинности с сайта (например, OAuth), а также персонализацию вашего приложения на основе учетной записи Майкрософт пользователя.

Дополнительную информацию можно найти в следующих статьях:

 

– Дуг Ротхаус (Doug Rothaus), старший разработчик контента, отдел контента для разработчиков для Windows

Выражаем отдельную благодарность Яшару Бахману (Yashar Bahman) за помощь при создании этой статьи.