2009-05-08 15 views
0

Ist es richtig zu verstehen, dass ein WCF-Dienst mit "Transportsicherheit", + "Zertifikatsauthentifizierung" und ohne eine "Client-Zertifikat" installierte Client-Seite eingerichtet werden könnte?Vorgehensweise: WCF mit Transportsicherheit + Server Cert Auth. OHNE Client Cert?

würde mein Szenario:

  • WCF Dienste auf Remote Server
  • Windows-Client möglicherweise auf Hunderte von Benutzern ausgeliefert Forms (authentifiziert Benutzer (gegen DB) und führt Aktionen über WCF-Service-Methoden)

Ich möchte meine Nachrichten über SSL verschlüsselt, deshalb habe ich die "Transport" -Methode ausgewählt und ich glaube, warum ich auch das Serverzertifikat brauche.

Ich habe eine Komplettlösung verfolgt, die mir alle oben genannten Punkte lieferte, aber die Notwendigkeit, ein Client-Zertifikat zu installieren, mit einschloss? Wenn ich diese Windows Forms-App an Kunden verschicke, wie könnten sie das Zertifikat installieren, wenn ich dazu gezwungen wäre? Es scheint wirklich, als würde ich hier einen wichtigen Punkt vermissen, da ich denken würde, dass das Installieren eines Zertifikats auf einem Benutzercomputer eine ziemlich große Frage wäre.

PS. Vielleicht aus dem, was ich bin reading here, mache ich meine Aufgabe zu kompliziert? Benötige ich lediglich ein SSL-Zertifikat, das auf unserem Webserver installiert ist und einfach über HTTPS auf den WCF-Dienst zugreift und möglicherweise nur basicHttpBinding verwenden kann? Effektiv müssen Sie sich nicht um Mechanismen zur Zertifikatsauthentifizierung sorgen?

Antwort

1

Sie benötigen kein Client-Zertifikat, es ist einfach ssl. Wenn Sie IIS verwenden, um den Dienst zu hosten, ist dies kein Problem, installieren Sie einfach das Zertifikat. Die Sicherheit auf Nachrichtenebene wird etwas komplizierter, aber Sie sollten mit dem SSL-Zertifikat einverstanden sein.

Wenn Sie basicHttpBinding verwenden, müssen Sie die Authentifizierung nicht ausschalten, standardmäßig aktiviert WSHttpBinding die Authentifizierung auf Nachrichtenebene, die Sie in der Webkonfiguration ausschalten können, indem Sie den Authentifizierungsmodus auf "Keine" setzen. Gehen Sie mit Basic, wenn Sie nur SSL benötigen. Wenn Sie ssl und vielleicht Windows-Authentifizierung möchten, dann gehen Sie mit WSHttpBinding.

+0

Ok danke. Ich dachte wirklich, dass ich es übermäßig kompliziert habe. WCF lockt Sie auf die Spur der Angabe, wenn Sie Ihren Dienst sichern möchten, adoptieren Sie wsHttpBinding. Grrrr-Argh. – GONeale

+0

@Josh OK, ich versuche basalHttpBinding nur ohne SSL aktiviert zu bekommen (muss cert registriert werden). Sieht dieser Code jedoch richtig aus, wenn der Dienst über HTTPS mit einem SSL-Zertifikat ausgelöst wurde? http://pastebin.com/m6ca08ad6 – GONeale

+0

Das sieht gut aus. Sie können Ihr Verhalten tatsächlich wie bei der Bindungskonfiguration wiederverwenden. Erhalten Sie irgendwelche Fehler? Möglicherweise müssen Sie dies zur Sicherheitskonfiguration der Bindung hinzufügen, , um alle Clientanforderungen zu deaktivieren. –

1

Wie Joshua sagte, Sie brauchen kein Client-Zertifikat, wenn Sie den Benutzernamen verwenden, um Ihren Client zu authentifizieren. In diesem Szenario übergibt der Client den Benutzernamen und das Kennwort und der Server stellt das Zertifikat für die gegenseitige Authentifizierung/den Handshake-Prozess bereit.

Ich habe gerade ein WCF-Sicherheitssystem für ein ähnliches System (Win Formen über Www) eingerichtet und ich habe die Anleitung von CodePlex, die eine Schritt für Schritt Checkliste zur Verfügung gestellt, um sicherzustellen, dass Sie alles an Ort und Stelle haben. Sie müssen nicht jedem Schritt folgen, zum Beispiel verwenden wir nicht die Rollenfunktion, sondern wir verwenden den Mitgliederspeicher.

Nachfolgend finden Sie eine kurze Zusammenfassung der Setup/Konfiguration mit wsHttpBinding mit Benutzername und Server-cert:

Client-Konfiguration:

 <security mode="Message"> 
     <message clientCredentialType="UserName" negotiateServiceCredential="true" 
      algorithmSuite="Default" establishSecurityContext="false" /> 
     </security> 

Benutzername Passwort auf Proxy gesetzt:

'ClientCredentials added to service call for authentication 
    objServiceClient.ClientCredentials.UserName.UserName = MyAppContext.Username 
    objServiceClient.ClientCredentials.UserName.Password = MyAppContext.Password 

Server Konfig:

  • Bindung:

     <wsHttpBinding> 
         <binding name="MyApp.wsHttpBindingMessageUname"> 
          <security mode="Message"> 
           <message clientCredentialType="UserName" negotiateServiceCredential="true" 
            establishSecurityContext="false" /> 
          </security> 
         </binding> 
         </wsHttpBinding> 
    
  • Verhalten:

     <serviceBehaviors> 
         <behavior name="MyApp.DefaultServiceBehavior"> 
          <serviceCredentials> 
           <serviceCertificate findValue="localhost" storeLocation="LocalMachine" 
           storeName="My" x509FindType="FindBySubjectName" /> 
           <userNameAuthentication userNamePasswordValidationMode="MembershipProvider" 
           membershipProviderName="AspNetSqlMembershipProvider" /> 
          </serviceCredentials> 
         </behavior> 
        </serviceBehaviors> 
    

Hoffnung, dass eine Hilfe ist, wenn Sie Fragen haben, lassen Sie mich wissen.

+0

Danke. Welcher Benutzername/welches Passwort ist das? Ein Benutzername/Passwort auf dem Server als Windows-Authentifizierung festgelegt? Oder benutzerdefinierte Benutzername/Passwort akzeptieren Sie auf Ihrem Formular gegen eine db überprüft? – GONeale

+0

In unserem Szenario haben wir die aspnet-Mitgliedschaft verwendet, also haben wir innerhalb unserer Server-Konfiguration einen -Block, der neben anderen Einstellungen den Mitgliedschafts-Provider, die Verbindungszeichenfolge für die db definiert. Dadurch weiß WCF, wo die Anmeldeinformationen überprüft werden. – Tanner

Verwandte Themen