Schließfach für Anmeldeinformationen: Die Lösung bei der Verwaltung von Benutzernamen und Kennwörtern in Windows Store-Apps

Wenn Sie bisher noch nichts vom Schließfach für Anmeldeinformationen, das für Windows Store-Apps verfügbar ist, mitbekommen haben, dann wird es jetzt langsam Zeit. Warum? Das Schließfach vereinfacht nicht nur die Aufgabe des Speicherns und Abrufens der Anmeldeinformationen, sondern es bietet dabei zusätzlich Sicherheit, und die Anmeldeinformationen sind per Microsoft-Konto überall kostenlos verfügbar.

Angenommen, Sie haben eine App, die sich mit einem Dienst zum Zugriff auf geschützte Ressourcen verbindet, wie z. B. Mediendateien, soziale Netzwerke usw., und Ihr Dienst benötigt für jeden Benutzer Anmeldeinformationen. Sie haben also eine Benutzeroberfläche in Ihre App integriert, mit der Benutzername und Kennwort eines Benutzers abgerufen werden. Diese Informationen werden dann zur Anmeldung des Benutzers beim Dienst verwendet. Alles funktioniert wie geschmiert.

Sie möchten jetzt jedoch Ihren Funktionsumfang erweitern und es den Benutzern möglich machen, ihre Anmeldeinformationen sicher zu speichern, sodass diese sich nicht bei jedem Öffnen Ihrer App wieder anmelden müssen. Hier kommt das Schließfach für Anmeldeinformationen ins Spiel. Mit nur wenigen einfachen Aufrufen der zugehörigen API lassen sich Benutzername und Kennwort der Benutzer speichern und problemlos wieder abrufen, sodass der Benutzer beim nächsten Öffnen Ihrer App wieder angemeldet wird.

Sicheres Speichern

Der größte Vorteil des Schließfachs für Anmeldeinformationen für Ihre App liegt darin, dass die Anmeldeinformationen an einem sichern Ort gespeichert und bei der Speicherung auf einem Datenträger verschlüsselt werden. Sie könnten die Benutzerinformationen natürlich in einer Datei im lokalen Speicher Ihrer App speichern, das Speichern der Anmeldeinformationen in reiner Textform stellt jedoch ein erhebliches Sicherheitsrisiko dar. Wenn das System eines Benutzers auf irgendeine Art und Weise beeinträchtigt wurde, können Benutzername und Kennwort problemlos ausgelesen und manipuliert werden. Wenn Benutzername und Kennwort jedoch im Schließfach für Anmeldeinformationen gespeichert sind, erhält ein böswilliger Angreifer im Höchstfall nur eine verschlüsselte Datei.

Jeder Windows-PC-Benutzer hat sein eigenes Schließfach für Anmeldeinformationen und der Zugriff auf einen Satz von Anmeldedaten ist auf die App beschränkt, die den Anmeldedatensatz gespeichert hat. Das heißt, dass Sie nur Anmeldedaten abrufen können, die für Ihre App gespeichert wurden. Dies bedeutet andererseits auch, dass andere Apps nicht auf die Anmeldedaten zugreifen können, die für Ihre App im Schließfach gespeichert wurden.

Roaming der Anmeldeinformationen

Ein weiterer Vorteil beim Speichern von Benutzername und Kennwort mithilfe des Schließfachs für Anmeldeinformationen besteht für die Benutzer darin, dass die Anmeldedaten über das Microsoft-Konto auf jeden gewünschten sicheren Computer übertragen werden, den die Benutzer mit dem entsprechenden Microsoft-Konto verwenden. Dies macht Ihre App, neben der erhöhten Sicherheit, noch benutzerfreundlicher, da die Benutzer auf jedem vertrauenswürdigen Computer, auf dem Ihre App installiert wurde, mittels Verknüpfung des Microsoft-Kontos automatisch angemeldet werden können, ohne erneut zur Eingabe der Anmeldeinformationen aufgefordert zu werden.

Bei Domänenkonten sieht das jedoch ein wenig anders aus. Wenn mittels Microsoft-Konto gespeicherte Anmeldedaten vorhanden sind und dieses Konto mit einem Domänenkonto verknüpft wird (wie beispielsweise einem Konto am Arbeitsplatz), werden die Anmeldedaten auf dieses Domänenkonto übertragen. Neu Anmeldedaten, die während einer Domänenkontositzung hinzugefügt wurden, werden jedoch nicht übertragen. Dadurch wird sichergestellt, dass private Anmeldedaten für die Domäne nicht außerhalb der Domäne veröffentlicht werden.

Speichern von Benutzeranmeldeinformationen

Das Speichern der Benutzeranmeldeinformationen im Schließfach für Anmeldeinformationen ist ein einfaches Verfahren in zwei Schritten. Zunächst wird ein Verweis auf das Schließfach für Anmeldeinformationen mithilfe des PasswordVault-Objekts aus dem Windows.Security.Credentials-Namespace abgerufen. Anschließend erstellen Sie ein PasswordCredential-Objekt, das einen Bezeichner für Ihre App, den Benutzernamen und das Kennwort enthält. Dieses Objekt wird an die PasswordVault.Add()-Methode übergeben, um den Anmeldedatensatz an das Schließfach zu übergeben.

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

Abrufen von Benutzeranmeldeinformationen

Es gibt verschiedene Wege, Benutzerinformationen aus dem Schließfach für Anmeldeinformationen abzurufen, nachdem Sie einen Verweis auf das PasswordVault-Objekt erstellt haben.

  • Sie können alle Informationen, die der Benutzer im Schließfach für Ihre App angegeben hat, mit der PasswordVault.RetrieveAll()-Methode abrufen.
  • Wenn Sie den Benutzernamen der gespeicherten Anmeldeinformationen kennen, können Sie alle Anmeldedaten 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.
  • Als letzte Möglichkeit können Sie bei bekanntem Benutzer- sowie Ressourcennamen eines Anmeldedatensatzes ausschließlich die Anmeldeinformationen mit der PasswordVault.Retrieve()-Methode abrufen.

Sehen wir uns nun ein Beispiel an, bei dem der Ressourcenname global in einer App gespeichert wurde und bei dem der Benutzer automatisch angemeldet wird, wenn ein Anmeldedatensatz für diesen gefunden wird. Falls mehrere Anmeldedatensätze für einen Benutzer gefunden werden, wird eine Aufforderung zur Auswahl der Standardanmeldeinformationen für dessen Anmeldung angezeigt.

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

Löschen von Benutzeranmeldeinformationen

Das Löschen der Benutzeranmeldeinformationen im Schließfach für Anmeldeinformationen ist auch ein einfaches Verfahren, das zwei Schritte umfasst. Zunächst wird wieder ein Verweis auf das Schließfach für Anmeldeinformationen mithilfe des PasswordVault-Objekts aus dem Windows.Security.Credentials-Namespace abgerufen. Anschließend werden die zu löschenden Anmeldeinformationen an die PasswordVault.Remove()-Methode übergeben.

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

Einfach und sicher

Wie Sie sehen, handelt es sich beim Schließfach für Anmeldeinformationen um ein einfach zu verwendendes Feature, mit dem die Authentifizierung der Benutzer und das Speichern der Anmeldeinformationen auf äußerst sichere Art und Weise für die zukünftige Verwendung erleichtert wird.

Weitere Informationen zur Windows 8-App-Authentifizierung finden Sie u. a. im Artikel zum Webauthentifizierungsbroker, den Sie zum Abrufen eines Authentifizierungstokens von einer Website (z. B.: OAuth) verwenden können, und unter Personalisieren von Apps mit Live Connect (Windows Store-Apps mit JavaScript und HTML).

Weitere Informationen finden Sie unter:

– Doug Rothaus, Senior Content Developer, Windows Developer Content

Besonderer Dank geht an Yashar Bahman für seine Hilfe und Beteiligung an diesem Blogbeitrag.