Schließfach für Anmeldeinformationen für Windows-Apps

In diesem Artikel wird beschrieben, wie Windows-Apps das Schließfach für Anmeldeinformationen verwenden können, um Benutzeranmeldeinformationen sicher zu speichern und abzurufen und zwischen Geräten mit dem Microsoft-Konto des Benutzers zu roamingn.

Die Windows-Runtime -APIs (WinRT) für den Zugriff auf das Schließfach für Anmeldeinformationen sind Teil des Windows Software Development Kit (SDK). Diese APIs wurden für die Verwendung in Universelle Windows-Plattform (UWP)-Apps erstellt, können aber auch in WinUI-Apps oder in verpackten Desktop-Apps verwendet werden, einschließlich WPF und Windows Forms. Weitere Informationen zur Verwendung von WinRT-APIs in Ihrer Windows-Desktop-App finden Sie unter Aufrufen Windows-Runtime APIs in Desktop-Apps.

Übersicht über das Beispielszenario

Sie verfügen beispielsweise über eine App, die eine Verbindung mit einem Dienst herstellt, um auf geschützte Ressourcen wie Mediendateien oder soziale Netzwerke zuzugreifen. Ihr Dienst erfordert Anmeldeinformationen für jeden Benutzer. Sie haben eine Benutzeroberfläche in Ihre App integriert, die den Benutzernamen und das Kennwort für den Benutzer abruft, der dann verwendet wird, um den Benutzer beim Dienst anzumelden. Mithilfe der Schließfach-API für Anmeldeinformationen können Sie den Benutzernamen und das Kennwort für Ihren Benutzer speichern und sie ganz einfach abrufen und den Benutzer automatisch anmelden, wenn er Ihre App das nächste Mal öffnet, unabhängig davon, auf welchem Gerät sie sich gerade befinden.

Benutzeranmeldeinformationen, die im Schließfach für Anmeldeinformationen gespeichert sind, laufen nicht ab, sind von ApplicationData.RoamingStorageQuota nicht betroffen und werden aufgrund von Inaktivität wie herkömmlichen Roamingdaten nicht gelöscht. Sie können jedoch nur bis zu 20 Anmeldeinformationen pro App im Schließfach für Anmeldeinformationen speichern.

Das Schließfach für Anmeldeinformationen funktioniert für Domänenkonten etwas anders. Wenn Anmeldeinformationen mit Ihrem Microsoft-Konto gespeichert sind und Sie dieses Konto einem Domänenkonto (z. B. dem Konto, das Sie bei der Arbeit verwenden) zuordnen, werden Ihre Anmeldeinformationen an dieses Domänenkonto übertragen. Alle neuen Anmeldeinformationen, die beim Anmelden mit dem Domänenkonto hinzugefügt wurden, werden jedoch nicht roamingen. Dadurch wird sichergestellt, dass private Anmeldeinformationen für die Domäne nicht außerhalb der Domäne verfügbar gemacht werden.

Speichern von Benutzeranmeldeinformationen

  1. Rufen Sie mithilfe des PasswordVault-Objekts aus dem Namespace "Windows.Security.Credentials" einen Verweis auf das Schließfach für Anmeldeinformationen ab.
  2. Erstellen Sie ein PasswordCredential-Objekt , das einen Bezeichner für Ihre App, den Benutzernamen und das Kennwort enthält, und übergeben Sie es an die PasswordVault.Add-Methode , um die Anmeldeinformationen zum Schließfach hinzuzufügen.
var vault = new Windows.Security.Credentials.PasswordVault();
vault.Add(new Windows.Security.Credentials.PasswordCredential(
    "My App", username, password));

Abrufen von Benutzeranmeldeinformationen

Sie haben mehrere Optionen zum Abrufen von Benutzeranmeldeinformationen aus dem Schließfach für Anmeldeinformationen, nachdem Sie einen Verweis auf das PasswordVault-Objekt haben.

  • Sie können alle Anmeldeinformationen abrufen, die der Benutzer für Ihre App im Schließfach mit der PasswordVault.RetrieveAll-Methode angegeben hat.
  • Wenn Sie den Benutzernamen für die gespeicherten Anmeldeinformationen kennen, können Sie alle Anmeldeinformationen für diesen Benutzernamen mit der PasswordVault.FindAllByUserName-Methode abrufen.
  • Wenn Sie den Ressourcennamen für die gespeicherten Anmeldeinformationen kennen, können Sie alle Anmeldeinformationen für diesen Ressourcennamen mit der PasswordVault.FindAllByResource-Methode abrufen.
  • Wenn Sie schließlich sowohl den Benutzernamen als auch den Ressourcennamen für eine Anmeldeinformation kennen, können Sie nur diese Anmeldeinformationen mit der PasswordVault.Retrieve-Methode abrufen.

Sehen wir uns ein Beispiel an, in dem wir den Ressourcennamen global in einer App gespeichert haben und der Benutzer automatisch angemeldet wird, wenn wir eine Anmeldeinformationen für sie finden. Wenn wir mehrere Anmeldeinformationen für denselben Benutzer finden, bitten wir den Benutzer, beim Anmelden eine Standardanmeldeinformationen auszuwählen.

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

Löschen von Benutzeranmeldeinformationen

Das Löschen von Benutzeranmeldeinformationen im Schließfach für Anmeldeinformationen ist auch ein schneller, zweistufiger Prozess.

  1. Rufen Sie mithilfe des PasswordVault-Objekts aus dem Namespace "Windows.Security.Credentials" einen Verweis auf das Schließfach für Anmeldeinformationen ab.
  2. Übergeben Sie die Anmeldeinformationen, die Sie löschen möchten, an die PasswordVault.Remove-Methode .
var vault = new Windows.Security.Credentials.PasswordVault();
vault.Remove(new Windows.Security.Credentials.PasswordCredential(
    "My App", username, password));

Bewährte Methoden

Verwenden Sie nur das Schließfach für Anmeldeinformationen für Kennwörter und nicht für größere Datenblobs.

Speichern Sie Kennwörter nur im Schließfach für Anmeldeinformationen, wenn die folgenden Kriterien erfüllt sind:

  • Der Benutzer hat sich erfolgreich angemeldet.
  • Der Benutzer hat sich für das Speichern von Kennwörtern entschieden.

Speichern Sie Anmeldeinformationen niemals im Nur-Text-Format mit App-Daten oder Roamingeinstellungen.