Hilfe bei Verwendung von WCF
-
Samstag, 28. Juli 2012 21:08
Hallo,
ich habe ein Problem mit dem WCF Service zwischen Server und Client bei der Autorisierung. Ich habe einen Client und einen Server erstellt, dazu mit Hilfe von "http://blog.pluralsight.com/2012/02/13/selfcert-create-a-self-signed-certificate-interactively-gui-or-programmatically-in-net/" ein Zertifikat erstellt und auf meinem Rechner zum Laufen gebracht. Dabei nutze ich auf den Server die Asp.NET Formularautentifizierung. Nun habe ich auf unserem Webserver den Server installiert und versucht, mit dem Client eine Verbindung aufzubauen von meinem Rechner. Ich bin bei der Zertifikat-Erstellung genau so vorgegangen, wie auf meiner Entwicklungsumgebung. Dabei kommt dann folgender Fehler:
"Fehler beim Aufbau der X509-Zertifikatkette (CN=localhost). Die Vertrauenskette des verwendeten Zertifikats kann nicht überprüft werden. Ersetzen Sie das Zertifikat, oder ändern Sie den Zertifikatvalidierungsmodus. Eine Zertifikatkette wurde zwar verarbeitet, endete jedoch mit einem Stammzertifikat, das beim Vertrauensanbieter nicht als vertrauenswürdig gilt."
Hier mal meine Anwendung:
1. Client - über Dienstverweis hinzufügen:
private void button1_Click(object sender, EventArgs e) { ServiceReference1.InstallServiceClient iscl = new ServiceReference1.InstallServiceClient(); iscl.ClientCredentials.UserName.UserName = "test"; iscl.ClientCredentials.UserName.Password = "test1$#"; ServiceReference1.InstallReturn ret = iscl.GetPlayerName("Test"); label1.Text = ret.IsOK.ToString(); label2.Text = ret.PlayerID.ToString(); iscl.Close(); }2. Server - web.config
<system.serviceModel> <services> <service behaviorConfiguration="basicBehavior" name="InstallService"> <endpoint address="" binding="wsHttpBinding" contract="IInstallService" bindingConfiguration="binding" /> </service> </services> <bindings> <wsHttpBinding> <binding name="binding"> <security mode="Message"> <message clientCredentialType="UserName" /> </security> </binding> </wsHttpBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="basicBehavior"> <serviceMetadata httpGetEnabled="true" /> <serviceCredentials> <serviceCertificate findValue="localhost" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="My" /> <clientCertificate> <authentication certificateValidationMode="None"/> </clientCertificate> <userNameAuthentication userNamePasswordValidationMode="MembershipProvider" membershipProviderName="AspNetSqlMembershipProvider"/> </serviceCredentials> <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="AspNetSqlRoleProvider" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel>
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] public class InstallService : IInstallService { public InstallService() { // // TODO: Konstruktorlogik hier hinzufügen // } public InstallReturn GetPlayerName(string macaddress) { InstallReturn iret = new InstallReturn(); iret.IsOK = true; iret.PlayerID = 10; return iret; } }Könnt ihr mir hier bitte weiterhelfen? Ich sitze schon seit einigen Tagen daran, komme aber nicht zu einer Lösung. Ich benötige nur eine vernünftige Lösung für die Kommunikation zwischen meinen Anwendungen und dem Server mit einer geeigneten Autorisierung.
LG
Claudia
- Verschoben Robert BreitenhoferMicrosoft Contingent Staff, Moderator Mittwoch, 8. August 2012 09:38 WCF (aus:Visual C#)
- Typ geändert Robert BreitenhoferMicrosoft Contingent Staff, Moderator Donnerstag, 6. September 2012 14:19 Keine Rückmeldung des Fragenstellender
- Typ geändert Robert BreitenhoferMicrosoft Contingent Staff, Moderator Montag, 17. September 2012 10:55 Rückmeldung des Fragenstellender
Alle Antworten
-
Sonntag, 29. Juli 2012 00:42Hallo Claudia,
das Problem tritt auf, da der Client die Vertrauenswürdigkeit des Zertifikats vom Server nicht überprüfen kann.
Ohne deine Umgebung zu kennen würde ich einfach mal den WCF Service im Browser aufrufen und das Zertifikat im lokalen Zertifikatsspeicher installieren. Ein besserer Weg ist natürlich die Nutzung eines "richtigen" Zertifikates. Also entweder von einer öffentlichen CA oder einer innerhalb deines Netzwerks. Es gibt auch die Möglichkeit, die Zertifikatsprüfung innerhalb von WCF zu überschreiben, wovon ich aber für den Produktivbetrieb strikt abrate!
Gruß Sebastian -
Sonntag, 29. Juli 2012 09:28
Hallo Sebastian,
ich bin kurz vorm verzweifeln. Ich habe das erstellte Zertifikat auf meinem Clientrechner gespeichert und doppelt auf die cert-Datei geklickt, beim Installieren dieses dann unter "vertrauenswürdiger Herausgeber" abgelegt. Es ändert jedoch nichts daran, dass es nicht funktioniert.
Ich habe eigentlich eine ganz einfache Testanwendung geschrieben:
1.) Server
[DataContract] public class InstallReturn { bool isOK = false; int playerID = 0; public InstallReturn() { } [DataMember] public bool IsOK { get { return isOK; } set { isOK = value; } } [DataMember] public int PlayerID { get { return playerID; } set { playerID = value; } } } [ServiceContract] public interface IInstallService { [OperationContract] InstallReturn GetPlayerName(string macaddress); } [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] public class InstallService : IInstallService { public InstallService() { // // TODO: Konstruktorlogik hier hinzufügen // } public InstallReturn GetPlayerName(string macaddress) { InstallReturn iret = new InstallReturn(); iret.IsOK = true; iret.PlayerID = 10; return iret; } }Das Zertifikat habe ich noch einmal neu erstellt mit dem o.g. Tool und unter "vertrauenswürdige Person" abgelegt. In der web.config habe ich folgende Einträge:
<?xml version="1.0"?> <configuration> <system.web> <authentication mode="Forms" /> <roleManager enabled="true" /> <compilation debug="true" targetFramework="4.0"/> <authorization> <deny users="?" /> </authorization> </system.web> <system.serviceModel> <services> <service behaviorConfiguration="basicBehavior" name="InstallService"> <endpoint address="" binding="wsHttpBinding" contract="IInstallService" bindingConfiguration="binding" /> </service> </services> <bindings> <wsHttpBinding> <binding name="binding"> <security mode="Message"> <message clientCredentialType="UserName" /> </security> </binding> </wsHttpBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="basicBehavior"> <serviceMetadata httpGetEnabled="true" /> <serviceCredentials> <serviceCertificate findValue="Farm" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="TrustedPeople" /> <userNameAuthentication userNamePasswordValidationMode="MembershipProvider" membershipProviderName="AspNetSqlMembershipProvider"/> </serviceCredentials> <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="AspNetSqlRoleProvider" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>In meinem Client-Formular habe ich einen Button, welcher nur die Rückgabewerte anzeigen soll:
private void button1_Click(object sender, EventArgs e) { ServiceReference1.InstallServiceClient iscl = new ServiceReference1.InstallServiceClient(); iscl.ClientCredentials.UserName.UserName = "test"; iscl.ClientCredentials.UserName.Password = "test1$#"; iscl.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None; ServiceReference1.InstallReturn ret = iscl.GetPlayerName("Test"); label1.Text = ret.IsOK.ToString(); label2.Text = ret.PlayerID.ToString(); iscl.Close(); }Ich erhalte den Fehler "Fehler beim Überprüfen der Sicherheit für die Nachricht.". Was kann ich noch tun, damit es endlich funktioniert?
Die Url auf den Server: http://wstest.screendesigner.info/installservice.svc
LG
Claudia
- Bearbeitet Claudia Salzwedel Sonntag, 29. Juli 2012 09:30
-
Mittwoch, 8. August 2012 09:36Besitzer
Hallo Claudia Salzwedel,
Könntest Du Dein Problem lösen? Wenn ja, es wäre schön, wenn Du posten würdest wie es funktioniert hat, denn dann profitieren unter Umständen andere mit dem gleichen Problem davon.
Schau Dir auch folgende Links an. Vielleicht können sie Dir weiterhelfen:
WCF error: “The X.509 certificate CN=localhost chain building failed …”
WCF service certificate and client side endpoint identity - why it doesn't work?
Beide obere Links sprechen von: „You should also add the noCheck in the server configuration“ …“<authentication certificateValidationMode="PeerOrChainTrust" revocationMode="NoCheck" />“
Pass ClientCredentials.UserName to server
An easy way to use certificates for WCF security
Wenn ich folgenden Diskussionsfaden verwende kann ich lesen dass es hier wirklich erforderlich ist, dass das Zertifikat auch auf der Client-Maschine registriert sein muss …wenn das Zertifikat eben nicht von einem "Trusted Issuer" (vertrauenswürdiger Herausgeber) kommt.
UserNamePasswordValidator Beispiel : Zertifikat für remote Maschine [Ausführen => MMC => Datei => Snap-In hinzufügen => Zertifikate => Vertrauenswürdige Personen (Trusted People)]
Wenn ich den Server starte und mir mit dem svcutil.exe die WCF-Clientsettings generieren lasse, wird sogar ein Eintrag für das erstellte Zertifikat hinzugefügt:
<identity>
<certificate encodedValue="AwAAAAEAA etc etc " />
</identity>
Grüße,
Robert
Robert Breitenhofer, MICROSOFT

Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können. -
Donnerstag, 6. September 2012 14:18Besitzer****************************************************************************************************************
Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
****************************************************************************************************************Robert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
-
Freitag, 14. September 2012 20:22
Hallo Robert,
ich habe gerade deine Antwort gesehen und werde sie mir nächste Woche mal ausführlich durcharbeiten. Ich hatte den WCF Dienst erst einmal aufgegeben und alles mit herkömmlichen Webservice gelöst.
Danke
Claudia
- Als Antwort markiert Robert BreitenhoferMicrosoft Contingent Staff, Moderator Montag, 17. September 2012 10:55

