21 Stimmen

Wcf Basis-Authentifizierung

Ich habe einige Probleme bei der Verwendung der einfachen Authentifizierung mit einem einfachen Wcf-Testdienst. Ich erhalte eine Ausnahme:

Der angeforderte Dienst 'http://qld-tgower/test/Service.svc' konnte nicht aktiviert werden. Weitere Informationen finden Sie in den Diagnose-Trace-Protokollen des > Servers.

Und im Trace-Log wird angezeigt:

Die auf dem Host konfigurierten Authentifizierungsschemata ("Basic") lassen die für die Bindung "BasicHttpBinding" konfigurierten Schemata nicht zu ("Anonymous"). Bitte stellen Sie sicher, dass der SecurityMode auf Transport oder TransportCredentialOnly eingestellt ist. Zusätzlich kann dies durch Ändern der Authentifizierungsschemata für diese Anwendung über das IIS-Verwaltungstool, über die Eigenschaft ServiceHost.Authentication.AuthenticationSchemes, in der Anwendungskonfigurationsdatei am Element <serviceAuthenticationManager>, durch Aktualisieren der Eigenschaft ClientCredentialType auf der Bindung oder durch Anpassen der Eigenschaft AuthenticationScheme auf dem HttpTransportBindingElement behoben werden.

Aber was ich nicht verstehe, wenn ich den falschen Benutzernamen und das falsche Passwort eingebe, heißt es IS mit einfacher Authentifizierung?

Die HTTP-Anfrage ist mit dem Client-Authentifizierungsschema "Basic" nicht autorisiert. Der vom Server empfangene Authentifizierungs-Header war 'Basic realm="qld-tgower"'.

Dies sind die Details meiner web.config

<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 Dienst

public class Service : IService
{

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

Gibt es etwas, das ich hier übersehe?

20voto

Trent Scholl Punkte 2377

Ändern Sie den Namen und den Vertrag des Dienstes, um den Namensraum einzubeziehen.

Entfernen Sie außerdem die Endpunktadresse (setzen Sie sie auf "") und nehmen Sie proxyCredentialType nicht in das Transport-Tag auf.

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>

3voto

Valamas Punkte 23081

Versuchen Sie es sowohl für Client- als auch für 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 im IIS installieren und anwenden.

Gehen Sie zu "Programme und Funktionen" / "Windows-Funktionen ein-/ausschalten". Aktivieren Sie die "Basisauthentifizierung" irgendwo unter IIS und Sicherheit.

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

Dies gilt natürlich nur für Entwicklungstests, und Sie werden gewarnt, dass Sie kein SSL-Zertifikat haben.

1voto

Luke Schafer Punkte 9113

Sie dürfen die Authentifizierung mit dem Benutzernamen nicht über eine ungesicherte Verbindung verwenden

Sie können die Nachricht durch Verwendung eines sicheren Transports (z. B. SSL) oder einer Nachrichtenverschlüsselung (mit Zertifikaten) sichern.

Ich habe verwendet ClearUsernameBinding in der Vergangenheit mit großem Erfolg eingesetzt, aber ich empfehle es nicht für die Produktion. Ich habe es verwendet, damit ich meinen gesamten Authentifizierungscode beibehalten konnte, ohne SSL in Entwicklungs-/Testumgebungen zu benötigen, aber mit SSL zu arbeiten, indem ich nur die Konfiguration änderte.

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

1voto

Vedran Punkte 9308

Damit ist das Problem für mich gelöst:

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

Als Referenz siehe: https://msdn.microsoft.com/en-gb/library/ff648505.aspx

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X