Windows uygulamaları için kimlik bilgisi kasası

Bu makalede, Windows uygulamalarının kimlik bilgilerini güvenli bir şekilde depolamak ve almak ve bunları kullanıcının Microsoft hesabıyla cihazlar arasında gezinmek için Kimlik Bilgisi Dolabı'nı nasıl kullanabileceği açıklanmaktadır.

Kimlik Bilgisi Dolabı erişimi için Windows Çalışma Zamanı (WinRT) API'leri , Windows Yazılım Geliştirme Seti'nin (SDK) bir parçasıdır. Bu API'ler WinUI'nin yanı sıra WPF ve WinForms gibi diğer masaüstü uygulamalarında kullanılabilir. Windows masaüstü uygulamanızda WinRT API'lerini kullanma hakkında daha fazla bilgi için bkz. Masaüstü uygulamalarında Windows Çalışma Zamanı API'lerini çağırma.

Örnek senaryoya genel bakış

Örneğin, medya dosyaları veya sosyal ağ gibi korumalı kaynaklara erişmek için bir hizmete bağlanan bir uygulamanız vardır. Hizmetiniz her kullanıcı için oturum açma bilgileri gerektirir. Uygulamanızda, kullanıcının kullanıcı adını ve parolasını girmesini sağlayan bir kullanıcı arabirimi oluşturdunuz ve bu bilgiler, kullanıcının hizmette oturum açması için kullanılır. Kimlik Bilgisi Dolabı API'sini kullanarak, kullanıcınızın kullanıcı adını ve parolasını depolayabilir ve onları kolayca geri alarak, hangi cihazda olursa olsun, kullancının uygulamanızı bir sonraki açışında oturumunu otomatik olarak açabilirsiniz.

Credential Locker'da depolanan kullanıcı kimlik bilgilerinin süresi dolmuyor, ApplicationData.RoamingStorageQuota'dan etkilenmez ve geleneksel dolaşım verileri gibi etkinlik dışı kalma nedeniyle temizlenmez. Ancak, Kimlik Bilgisi Dolabı'nda uygulama başına en fazla 20 kimlik bilgisi depolayabilirsiniz.

Credential Locker, etki alanı hesapları için biraz farklı çalışır. Microsoft hesabınızla depolanan kimlik bilgileri varsa ve bu hesabı bir etki alanı hesabıyla (iş yerinde kullandığınız hesap gibi) ilişkilendirirseniz, kimlik bilgileriniz bu etki alanı hesabına gider. Ancak, etki alanı hesabıyla oturum açıldığında eklenen yeni kimlik bilgileri dolaşıma açılmaz. Bu, etki alanı için özel kimlik bilgilerinin etki alanı dışında kullanıma sunulmamasını sağlar.

Kullanıcı kimlik bilgilerini depolama

  1. Windows.Security.Credentials ad alanından PasswordVault nesnesini kullanarak Credential Locker'a bir başvuru alın.
  2. Uygulamanızın tanımlayıcısını, kullanıcı adını ve parolayı içeren bir PasswordCredential nesnesi oluşturun ve bunu PasswordVault.Add yöntemine geçirerek kimlik bilgilerini kasaya ekleyin.
var vault = new Windows.Security.Credentials.PasswordVault();
vault.Add(new Windows.Security.Credentials.PasswordCredential(
    "My App", username, password));

Kullanıcı kimlik bilgilerini alma

PasswordVault nesnesine bir başvurunuz olduktan sonra Kimlik Bilgisi Dolabı'ndan kullanıcı kimlik bilgilerini almak için çeşitli seçenekleriniz vardır.

  • Kullanıcının uygulamanız için sağladığı tüm kimlik bilgilerini PasswordVault.RetrieveAll yöntemiyle dolabından alabilirsiniz.
  • Depolanan kimlik bilgilerinin kullanıcı adını biliyorsanız, PasswordVault.FindAllByUserName yöntemiyle bu kullanıcı adının tüm kimlik bilgilerini alabilirsiniz.
  • Depolanan kimlik bilgilerinin kaynak adını biliyorsanız, PasswordVault.FindAllByResource yöntemiyle bu kaynak adının tüm kimlik bilgilerini alabilirsiniz.
  • Son olarak, bir kimlik bilgisinin hem kullanıcı adını hem de kaynak adını biliyorsanız , PasswordVault.Retrieve yöntemiyle yalnızca bu kimlik bilgilerini alabilirsiniz.

Kaynak adını bir uygulamada genel olarak depoladığımız ve kullanıcı için bir kimlik bilgisi bulduğumuzda otomatik olarak oturum açtığımız bir örneğe göz atalım. Aynı kullanıcı için birden çok kimlik bilgisi bulursak, kullanıcıdan oturum açarken kullanılacak varsayılan kimlik bilgilerini seçmesini isteriz.

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

Kullanıcı kimlik bilgilerini silme

Kimlik Bilgisi Dolabı'nda kullanıcı kimlik bilgilerini silmek de hızlı, iki adımlı bir işlemdir.

  1. Windows.Security.Credentials ad alanından PasswordVault nesnesini kullanarak Credential Locker'a bir başvuru alın.
  2. Silmek istediğiniz kimlik bilgilerini PasswordVault.Remove yöntemine geçirin.
var vault = new Windows.Security.Credentials.PasswordVault();
vault.Remove(new Windows.Security.Credentials.PasswordCredential(
    "My App", username, password));

En iyi uygulamalar

Daha büyük veri blobları için değil, yalnızca parolalar için kimlik bilgisi dolabını kullanın.

Parolaları yalnızca aşağıdaki ölçütlere uyulsa kimlik bilgisi dolabına kaydedin:

  • Kullanıcı başarıyla oturum açtı.
  • Kullanıcı parolaları kaydetmeyi tercih etti.

Uygulama verilerini veya dolaşım ayarlarını kullanarak hiçbir zaman kimlik bilgilerini düz metin olarak depolamayın.