Announcement

Collapse
No announcement yet.

WCF: Authentifizierung über ClientCredentials

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • WCF: Authentifizierung über ClientCredentials

    Hallo,

    ich habe ein funktionierendes Client/Server-Verhältnis. Der WCF-Server und mein Client laufen testweise auf meinem Notebook.

    Wenn ich den Client nun auf einem anderen Rechner starte, erhalte ich eine SOAP-Sicherheitsfehlermeldung.
    "System.TypeInitializationException: Der Typeninitialisierer für "XXX" hat eine Ausnahme verursacht. ---> System.ServiceMOdel.SecurityNegotiationException: Fehler bei der SOAP-Sicherheitsaushandlung mit "http://MeinRechner/MeinDienst.svc" für Ziel "http://MeinRechner/MeinDienst.svc"."

    Also habe ich mir ein paar Tutorials und Webcasts zum Thema WCF-Security angeschaut. Ich habe mich für die Variante "Benutzername und Passwort direkt abgleichen" entschieden. Das soll anbgl. recht einfach über den Security-Modus "Message" oder "TransportWithMessageCredentials" funktionieren.

    In meinen Versuchen wurde dann aber immer ein gültiges Serverzertifikat verlangt. Ich möchte aber (vorerst) nur einen einfachen User/Passwort-Abgleich bewirken.

    Gibt es keine "einfachere" Variante ohne Zertifikat (evtl. über einen Kniff in den Settings)?

  • #2
    Hallo,

    ich habe ein funktionierendes Client/Server-Verhältnis.
    Ist hab ein funktionierendes Verhältnis zu meiner Freundin - aber jeder wie er will (sorry, aber wenn ich das lese muss ich an sowas denken)

    Also habe ich mir ein paar Tutorials und Webcasts zum Thema WCF-Security angeschaut.
    Hast du die Tutorials auch gelesen

    Für die Zertikiat-Variante finde ich dies als guten Einstieg: An easy way to use certificates for WCF security


    mfG Gü

    PS: Ignoriere die Ironie in der Antwort
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Danke für deine Antwort. Speziell die von dir genannen Tutorials hatte ich noch nicht gelesen. Jetzt habe ich sie gelesen und bin nicht weiter gekommen.

      Meine Web.Config - Datei sieht genau so aus, leider erhalte ich aber die Fehlermeldung "Das Dienstzertifikat ist nicht bereitgestellt. Geben Sie ein Dienstzertifikat in ServiceCredentials an."

      Wenn ich einen Fehler in der Config habe, dann keinen (für mich) offensichtlichen.

      Hier der wichtige Teil der Web.Config meines WCF-Servers:
      HTML Code:
      <system.serviceModel>
          <bindings>
            <wsHttpBinding>
              <binding name="EndpointServerBasicHttpBinding" closeTimeout="00:01:00" openTimeout="00:01:00"
                receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
                bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                messageEncoding="Text" textEncoding="utf-8"
                useDefaultWebProxy="true">
                <security mode ="Message">
                  <message clientCredentialType="UserName"/>                        
                </security>
              </binding>
            </wsHttpBinding>
      
      <services>
            <service behaviorConfiguration="Tour4U.EndpointServer.EndpointVerbindungBehavior"
              name="Tour4U.EndpointServer.EndpointVerbindung">
              <endpoint address="" binding="wsHttpBinding" bindingConfiguration="EndpointServerBasicHttpBinding" contract="Tour4U.EndpointServer.IEndpointVerbingung">
                <identity>          
                  <dns value="localhost" />
                </identity>
              </endpoint>
              <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange">          
              </endpoint>
            </service>
      </services>
      
      
      <behaviors>
            <serviceBehaviors>
              <behavior name="Tour4U.EndpointServer.EndpointVerbindungBehavior">
                <serviceMetadata httpGetEnabled="true"/>          
                <serviceDebug includeExceptionDetailInFaults="true"/>
                <serviceCredentials>
                  <userNameAuthentication  userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="PasswortValidator, EndpointServer"/>
                  <!--
                  <serviceCertificate x509FindType="FindByThumbprint" findValue="d07d57c62b8f87f54d4ff57b965c40f77de17fe3"/>
                  -->
                </serviceCredentials>
              </behavior>
            </serviceBehaviors>
          </behaviors>
        </system.serviceModel>
      Hier der Code meines Passwortvalidators:
      [highlight=c#]
      public class PasswortValidator : UserNamePasswordValidator
      {

      public override void Validate(string userName, string password)
      {
      if (!string.Equals(userName, password))
      {
      throw new SecurityTokenValidationException();
      }
      }
      }
      [/highlight]


      Bis jetzt gelingt es mir nicht einmal, den so präparierten WCF-Dienst in meinem Visual Studio 2008 zu starten, da augenblicklich die o.g. Fehlermeldung erscheint.

      Hast du (oder noch jemand) eine Idee, warum ich meinen Dienst nicht mit der highly sophisticated Passwortkontrolle benutzen kann?

      Comment


      • #4
        Hallo,

        hab mir die Konfigs nicht angeschaut, aber warum prüfst du im Validator
        [highlight=c#]
        if (!string.Equals(userName, password))
        [/highlight]
        ob Benutzername = Passwort?

        Wenn die Beispiele der MSDN (wenn sie korrket kopiert wurden) nicht funktionieren ist höchstwahrscheinlich ein Netzwerkproblem schuld.

        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          Och Gü,

          das ist doch nur eine Dummy-Prüfung. Sobald mein Client sich wieder mit dem Server versteht und ich sicher sein kann, dass er nur den Dienst nutzen kann, wenn Username = Passwort, dann werde ich diesen Dummy selbstverständlich gegen eine DB-Abfrage austauschen.

          Ein Netzwerkproblem schließe ich aus, da das vorher beschriebene Problem ("wo ist das Zertifikat"-Fehlermeldung) schon bei mir im lokalen Betrieb auftritt.

          Da wird mir wohl nichts anderes übrig bleiben, als zu hoffen, dass jemandem etwas bei meiner Config auffällt. Parallel werde ich das MSDN-Beispiel 1:1 übernehmen und bei Erfolg iterativ um meinen Code erweitern. :-(

          Comment


          • #6
            Auch MSDN bringt keine Besserung

            Ich rücke langsam aber sicher in den Abgrund der Zertifikatwelt...

            Nachdem alle Fixversuche gescheitert sind, habe ich mir das MSDN-Beispiel von Gü zur Brust genommen und einen simplen WCF-Dienst ohne Zertifikat erstellt, der zwei Zahlen addiert.
            Link: http://msdn.microsoft.com/en-us/library/ms733131.aspx

            Kaum starte ich den Server, erhalte ich die Fehlermeldung, dass kein Zertifikat vorhanden sei. Da der Code im Anhang mit Absicht schmal gehalten wurde, wäre es fantastisch, wenn sich den jemand kurz anschauen könnte. Oder zumindest ein kurzes Posting, ob woanders der selbe Effekt auftritt - dann ist mein NB das Problem.

            Danke im Voraus für die Unterstützung!
            Attached Files

            Comment

            Working...
            X