Vorgehensweise: Authentifizierung mit Benutzernamen und Kennwort

In diesem Thema wird veranschaulicht, wie ein Windows Communication Foundation (WCF)-Dienst die Authentifizierung eines Clients mit einem Windows-Domänenbenutzernamen und -kennwort ermöglicht. Es wird davon ausgegangen, dass Sie über einen funktionsfähigen selbst gehosteten WCF-Dienst verfügen. Ein Beispiel für die Erstellung eines einfachen, selbst gehosteten WCF-Dienstes finden Sie in der Anleitung „Erste Schritte“. In diesem Thema wird davon ausgegangen, dass der Dienst im Code konfiguriert ist. Wenn Sie sich ein Beispiel für die Konfiguration eines ähnlichen Dienstes mithilfe einer Konfigurationsdatei ansehen möchten, lesen Sie bitte den Abschnitt Benutzername für Nachrichtensicherheit.

Um einen Dienst zu konfigurieren, der seine Clients mit dem Benutzernamen und Kennwort einer Windows-Domäne authentifiziert, verwenden Sie die WSHttpBinding und legen die Security.Mode-Eigenschaft auf Message fest. Darüber hinaus müssen Sie ein X.509-Zertifikat angeben, das zum Verschlüsseln des Benutzernamens und Kennworts verwendet wird, während diese vom Client an den Dienst gesendet werden.

Auf dem Client muss der Benutzer zur Eingabe des Benutzernamens und Kennworts und zur Eingabe der Anmeldeinformationen für den WCF-Clientproxy aufgefordert werden.

So konfigurieren Sie einen WCF-Dienst für die Authentifizierung mit dem Benutzernamen und Kennwort einer Windows-Domäne

  1. Erstellen Sie eine Instanz von WSHttpBinding, legen Sie den Sicherheitsmodus der Bindung auf WSHttpSecurity.Message fest, legen Sie den ClientCredentialType der Bindung auf MessageCredentialType.UserName fest, und fügen Sie dem Diensthost mithilfe der konfigurierten Bindung einen Dienstendpunkt hinzu, wie im folgenden Code dargestellt:

    // ...
    var userNameBinding = new WSHttpBinding();
    userNameBinding.Security.Mode = SecurityMode.Message;
    userNameBinding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
    svcHost.AddServiceEndpoint(typeof(IService1), userNameBinding, "");
    // ...
    
  2. Geben Sie das Serverzertifikat an, das zum Verschlüsseln des über die Verbindung gesendeten Benutzernamens und Kennworts verwendet wird. Dieser Code sollte direkt auf den vorangehenden Code folgen. Im folgenden Beispiel wird das Zertifikat verwendet, das von der Datei setup.bat aus dem Beispiel Benutzername für Nachrichtensicherheit erstellt wurde:

    // ...
    svcHost.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindBySubjectName, "localhost");
    // ...
    

    Sie können ein eigenes Zertifikat verwenden, indem Sie im Code auf das eigene Zertifikat verweisen. Weitere Informationen zum Erstellen und Verwenden von Zertifikaten finden Sie unter Verwenden von Zertifikaten. Stellen Sie sicher, dass sich das Zertifikat im Speicher für vertrauenswürdige Personen für den lokalen Computer befindet. Dazu können Sie mmc.exe ausführen und im Menü Datei das Menüelement Snap-In hinzufügen/entfernen auswählen. Wählen Sie im Dialogfeld Snap-In hinzufügen/entfernen die Option Zertifikat-Snap-In aus, und klicken Sie auf Hinzufügen. Wählen Sie im Dialogfeld Zertifikat-Snap-In die Option Computerkonto aus. Standardmäßig befindet sich das Zertifikat, das im Beispiel für Nachrichtensicherheit – Benutzername generiert wurde, im Ordner Persönlich – Zertifikate. Es wird im MMC-Fenster als "localhost" in der Spalte Ausgestellt für aufgelistet. Ziehen Sie das Zertifikat in den Ordner Vertrauenswürdige Personen, und legen Sie es dort ab. Dadurch kann WCF das Zertifikat beim Ausführen einer Authentifizierung als vertrauenswürdiges Zertifikat behandeln.

So rufen Sie den Dienst auf, der den Benutzernamen und das Kennwort übergibt

  1. Die Clientanwendung muss den Benutzer zur Eingabe von Benutzername und Kennwort auffordern. Der folgende Code fordert den Benutzer zur Eingabe von Benutzername und Kennwort auf.

    Warnung

    Dieser Code sollte nicht in Produktionssystemen verwendet werden, da das Kennwort bei der Eingabe sichtbar ist.

    public static void GetPassword(out string username, out string password)
    {
        Console.WriteLine("Provide a valid machine or domain account. [domain\\user]");
        Console.WriteLine("   Enter username:");
        username = Console.ReadLine();
        Console.WriteLine("   Enter password:");
        password = Console.ReadLine();
    }
    
  2. Erstellen Sie eine Instanz des Clientproxys, indem Sie die Anmeldeinformationen des Clients wie im folgenden Code dargestellt angeben:

    string username;
    string password;
    
    // Instantiate the proxy.
    var proxy = new Service1Client();
    
    // Prompt the user for username & password.
    GetPassword(out username, out password);
    
    // Set the user's credentials on the proxy.
    proxy.ClientCredentials.UserName.UserName = username;
    proxy.ClientCredentials.UserName.Password = password;
    
    // Treat the test certificate as trusted.
    proxy.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.PeerOrChainTrust;
    // Call the service operation using the proxy
    

Siehe auch