Vorgehensweise: Authentifizierung mit Benutzernamen und Kennwort

In diesem Thema wird veranschaulicht, wie Sie einem Dienst von Windows Communication Foundation (WCF) die Authentifizierung eines Clients mit einem Benutzernamen und einem Kennwort einer Windows-Domäne ermöglichen.Es wird davon ausgegangen, dass Sie über einen funktionierenden selbst-gehosteten WCF-Dienst verfügen.Ein Beispiel für das Erstellen eines selbst-gehosteten WCF-Basisdiensts finden Sie unter Lernprogramm 'Erste Schritte'.In diesem Thema wird davon ausgegangen, dass der Dienst im Code konfiguriert ist.Ein Beispiel für das Konfigurieren eines ähnlichen Diensts mit einer Konfigurationsdatei finden Sie unter Nachrichtensicherheit – Benutzername.

Um einen Dienst zu konfigurieren, der seine Clients mit dem Benutzernamen und Kennwort einer Windows-Domäne authentifiziert, verwenden Sie 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 von Benutzernamen und Kennwort verwendet wird, während diese vom Client an den Dienst gesendet werden.

Auf dem Client muss der Benutzer zur Eingabe von Anmeldenamen und Kennwort und zur Eingabe der Anmeldeinformationen für den WCF-Clientproxy aufgefordert werden.

So erstellen Sie einen WCF-Dienst, der zur Authentifizierung den Benutzernamen und das Kennwort einer Windows-Domäne verwendet.

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

    // ...  
    WSHttpBinding 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-Datei aus dem Beispiel Nachrichtensicherheit – Benutzername erstellt wurde:

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

    Sie können ein eigenes Zertifikat verwenden, indem Sie im Code einen Verweis auf Ihr eigenes Zertifikat setzen.Weitere Informationen zum Erstellen und Verwenden von Zertifikaten finden Sie unter Verwenden von Zertifikaten.Stellen Sie sicher, dass sich das 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 als "localhost" in der Spalte Ausgestellt für im MMC-Fenster aufgelistet.Ziehen Sie das Zertifikat auf 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 Benutzername und das Kennwort übergibt

  1. Die Clientanwendung muss den Benutzer zur Eingabe von Benutzernamen und Kennwort auffordern.Der folgende Code fordert den Benutzer zur Eingabe von Benutzernamen 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();             
                return;  
            }  
    
  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  
    Service1Client 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

<xref:System.ServiceModel.WsHttpBinding>
WSHttpSecurity
SecurityMode
UserName
Password
UserNamePasswordClientCredential
Mode
ClientCredentialType
Transportsicherheit mit Standardauthentifizierung
Sicherheit bei verteilten Anwendungen
<wsHttpBinding>