Wcf-Basisauthentifizierung

  • Probleme bei der Verwendung der Basisauthentifizierung mit einem einfachen Test-Wcf-Dienst. Ich erhalte eine Ausnahme:

    Der angeforderte Dienst 'http: //qld-tgower/test/Service.svc' konnte nicht aktiviert werden. Siehe das & gt; Weitere Informationen finden Sie in den Diagnoseprotokollprotokollen des Servers.

    Im Traceprotokoll wird Folgendes angezeigt:

    Die auf dem Host konfigurierten Authentifizierungsschemata ('Basic') erlauben keine für die Bindung 'BasicHttpBinding' ('Anonymous') konfigurierten. Stellen Sie sicher, dass der SecurityMode auf Transport oder TransportCredentialOnly eingestellt ist. Darüber hinaus kann dies behoben werden, indem die Authentifizierungsschemata für diese Anwendung über das IIS-Verwaltungstool über die ServiceHost.Authentication.AuthenticationSchemes-Eigenschaft in der Anwendungskonfigurationsdatei unter & lt; serviceAuthenticationManager & gt; Element, durch Aktualisieren der ClientCredentialType-Eigenschaft für die Bindung oder durch Anpassen der AuthenticationScheme-Eigenschaft für das HttpTransportBlementElement.

    Aber was ich nicht verstehe, wenn ich uns verstehe den falschen Benutzernamen und das falsche Kennwort, heißt es, dass die Standardauthentifizierung verwendet wird?

    Die HTTP-Anforderung ist mit dem Clientauthentifizierungsschema 'Basic' nicht autorisiert '. Der vom Server empfangene Authentifizierungsheader lautete 'Basic realm = "qld-tgower"'.

    Dies sind meine web.config-Details < / strong>

     <system.serviceModel>
    <services>
      <service name="WcfService"
          behaviorConfiguration="Behavior">
        <endpoint address="http://QLD-TGOWER/test/Service.svc"
                  binding="basicHttpBinding"
                  bindingConfiguration="httpBinding"
                  contract="IService" />
      </service>
    </services>
    <diagnostics>
      <endToEndTracing activityTracing="false" messageFlowTracing="true" propagateActivity="true"></endToEndTracing>
    </diagnostics>
    <bindings>
      <basicHttpBinding>
        <binding name="httpBinding">
          <security mode="TransportCredentialOnly">
            <transport  clientCredentialType="Basic" proxyCredentialType="Basic">
            </transport>
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
    </system.serviceModel>
     

    und dies ist meine App.config

     <system.serviceModel>
        <diagnostics>
          <endToEndTracing activityTracing="true" />
          <messageLogging logMessagesAtTransportLevel="true" />
        </diagnostics>
        <bindings>
          <basicHttpBinding>
            <binding name="BasicHttpBinding_IService" >
              <security mode="TransportCredentialOnly">
    
                <transport clientCredentialType="Basic" proxyCredentialType="Basic"></transport>
                <message clientCredentialType="UserName" />
              </security>
    
            </binding>
          </basicHttpBinding>
        </bindings>
        <client>
          <endpoint address="http://QLD-TGOWER/test/Service.svc" binding="basicHttpBinding"
            bindingConfiguration="BasicHttpBinding_IService" contract="ServiceReference1.IService"
            name="BasicHttpBinding_IService" />
        </client>
    </system.serviceModel>
     

    meine Testanwendung

     private static void Main(string[] args)
    {
        var proxy = new ServiceClient("BasicHttpBinding_IService");
        var clientCredentials = proxy.ClientCredentials;
        clientCredentials.UserName.UserName = "username";
        clientCredentials.UserName.Password = "password";
        var res = proxy.GetData(1);
        Console.WriteLine(res);
        Console.WriteLine("Done");
        Console.ReadKey(true);
    }
     

    Und mein Service

     public class Service : IService
    {
    
       public string GetData(int value)
       {
           return string.Format("You entered: {0}", value);
       }
    }
     

    Gibt es etwas, das mir fehlt?

    22 November 2011
    TheRealTy
4 answers
  • Ändern Sie den Namen und den Vertrag des Services, um den Namespace einzuschließen.

    Entfernen Sie außerdem die Endpunktadresse (setzen Sie sie auf "") und schließen Sie sie nicht ein proxyCredentialType im Transport-Tag.

    Das Endergebnis der web.config sollte in etwa wie folgt aussehen

       <system.serviceModel>
    
        <services>
          <service name="MyNameSpace.MyService" behaviorConfiguration="asdf">
            <endpoint address="" binding="basicHttpBinding" 
                bindingConfiguration="httpBinding" contract="MyNameSpace.IMyService" />
          </service>
        </services>
    
        <diagnostics>
          <endToEndTracing activityTracing="true" messageFlowTracing="true" 
              propagateActivity="true">
          </endToEndTracing>
        </diagnostics>
    
        <bindings>
          <basicHttpBinding>
            <binding name="httpBinding">
              <security mode="TransportCredentialOnly">
                <transport clientCredentialType="Basic" />
              </security>
            </binding>
          </basicHttpBinding>
        </bindings>
    
        <behaviors>
          <serviceBehaviors>
            <behavior name="asdf">
              <!-- To avoid disclosing metadata information, set the value below to 
                   false and remove the metadata endpoint above before deployment -->
              <serviceMetadata httpGetEnabled="true" />
              <!-- To receive exception details in faults for debugging purposes, 
                   set the value below to true.  Set to false before deployment to avoid 
                   disclosing exception information -->
              <serviceDebug  includeExceptionDetailInFaults="true" />
    
            </behavior>
          </serviceBehaviors>
        </behaviors>
    
        <serviceHostingEnvironment multipleSiteBindingsEnabled="false"/>
    
      </system.serviceModel>
     
    23 September 2013
    Steven
  • Testen Sie sowohl Client- als auch Serverkonfigurationen.

     <basicHttpBinding>
        <binding name="BasicHttpBinding_IService">
            <security mode="TransportCredentialOnly">
                <transport clientCredentialType="Basic" />
            </security>
        </binding>
    </basicHttpBinding>
     

    Basisauthentifizierung installieren / aktivieren

    Möglicherweise müssen Sie auch die Basisauthentifizierung in IIS installieren und anwenden.

    Springen Sie zu "Programme und Funktionen" / "Windows-Funktionen ein- / ausschalten". Aktivieren Sie "grundlegende Authentifizierung" irgendwo unter IIS und Sicherheit.

    Ich habe die IIS-Konsole geschlossen, geöffnet und konnte sie unter aktivieren Authentifizierungseinstellungen.

    Dies gilt natürlich für einen Entwicklungstest und warnt Sie, dass Sie kein SSL-Zertifikat besitzen.

    19 November 2013
    Valamas
  • Dies hat das Problem für mich gelöst:

     <bindings>
      <basicHttpBinding>
        <binding>
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Windows" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
     

    Referenz: https://msdn.microsoft.com/de-de/library/ff648505. aspx

    13 October 2015
    Vedran
  • Sie können die Benutzername-Authentifizierung nicht über eine ungesicherte Verbindung verwenden.

    Sie können die Nachricht durch einen sicheren Transport (z. B. SSL) oder Nachrichtenverschlüsselung ( mit Zertifikaten)

    Ich habe ClearUsernameBinding in der Vergangenheit zu großem Erfolg, aber ich empfehle es in der Produktion nicht. Ich habe es so verwendet, dass ich meinen gesamten Authentifizierungscode aufrechterhalten konnte, ohne SSL in Dev / Test-Umgebungen zu benötigen, aber mit SSL arbeiten zu müssen, indem nur die Konfiguration geändert wurde.

    Hinweis: Diese benutzerdefinierte Bindung ist nicht perfekt und ich musste sie ein wenig ändern, um bestimmte Konfigurationsänderungen zu ermöglichen.

    22 November 2011
    Luke Schafer