2013-03-07 9 views
17

Ich erhalte den folgenden Fehler, wenn ich die Windows-Authentifizierung aktivieren und anonym in IIS deaktiviert.Make Wcf Service IntegratedWindowsAuthentication

Die Authentifizierungsschemata auf dem Host konfiguriert ('IntegratedWindowsAuthentication') erlauben nicht diejenigen, die Bindung 'Basichttpbinding' auf konfiguriert ('Anonymous'). Stellen Sie sicher, dass der SecurityMode auf Transport oder TransportCredentialOnly festgelegt ist. Zusätzlich kann dies durch Ändern der Authentifizierung Schemata für diese Anwendung durch das IIS-Management-Tool, durch die ServiceHost.Authentication.AuthenticationSchemes Eigenschaft, in der Anwendungskonfigurationsdatei am Elemente, durch die Aktualisierung der ClientCredentialType Eigenschaft auf dem aufgelösten Bindung, oder durch Anpassen der AuthenticationScheme-Eigenschaft für das 0ttHttpTransportBindingElement.

Mein WCF-Dienst web.config ist wie folgt ...

<?xml version="1.0"?> 
<configuration> 
    <appSettings> 
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> 
    </appSettings> 
    <system.web> 
    <compilation debug="true" targetFramework="4.5" /> 
    <httpRuntime targetFramework="4.5"/> 
    </system.web> 
    <system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="BasicHttpEndpointBinding"> 
      <security mode="TransportCredentialOnly"> 
      <transport clientCredentialType="Windows" /> 
      </security> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint binding="basicHttpBinding" 
     bindingConfiguration="BasicHttpEndpointBinding" 
     contract="Test.IService1" name="BasicHttpEndpoint" /> 
    </client> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <serviceAuthenticationManager 
      authenticationSchemes="IntegratedWindowsAuthentication"/> 
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false"/> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <protocolMapping> 
     <add binding="basicHttpBinding" scheme="http" /> 
    </protocolMapping>  
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" 
     multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    <directoryBrowse enabled="true"/> 
    </system.webServer> 
</configuration> 

Bitte Beratung ..

+0

Sie schreiben nicht web.config ... – Tim

+0

Sein jetzt bereit. bitte Beratung. – user214471

+0

Ich sehe keine Service-Definition in Ihrer Konfiguration, nur ein Client. Wenn dies die Konfigurationsdatei Ihres Dienstes ist und Sie .NET 4.0 und höher verwenden, erhalten Sie wahrscheinlich einen Standardendpunkt, an dem die Sicherheit möglicherweise nicht richtig eingestellt ist. Sie müssen die Bindung, die Sie in Ihrer Konfigurationsdatei erstellen, auch Ihrem Dienst zuweisen. – Tim

Antwort

0
<services> 
     <service name="Test.Service1" behaviorConfiguration="TestName"> 
     <endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpEndpointBinding" contract="Test.IService1" /> 
     </service> 
    </services> 

Es ist mein Problem gelöst.

39

In .Net 4.0+, Simplified WCF configuration werden die 'anonymen' Konfigurationen verwendet, wenn die Konfigurationen nicht explizit für einzelne Services im Bereich <Services> festgelegt sind. Wenn Sie den Name = "BasicHttpEndpointBinding" aus dem <Bindungselement> entfernen oder wenn Sie das < bindende Element > als neues Element ohne Namensattribut duplizieren, wird es die standardmäßige anonyme Bindung, die Ihre WCF-Dienste verwenden. Dies ist oft nützlich in Fällen, in denen Sie WCF-Dienste bereitstellen und konsumieren müssen, die möglicherweise nicht alle die gleiche Konfiguration haben, aber zumindest können Sie eine Standardkonfiguration für die Dienste festlegen, die keine bestimmte Konfigurationsgruppe haben. Das standardmäßige/anonyme Konzept ist auch auf <Verhalten> Elemente anwendbar.

<bindings> 
    <basicHttpBinding> 
    <binding> <!--Notice, no name attribute set--> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Windows" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 

Auch möchte ich hinzufügen, dass, wenn Sie Ihre WCF-Dienste Authentifizierung erforderlich ist, bedeutet dies, dass Sie müssen entweder den Dienst mit einem echten Benutzerkonto konsumieren, oder Sie müssen die Domäne \ Clientcomputername $ Konto gewähren Zugriff auf den Dienst - vielleicht ist es die richtige Lösung für viele Leute, die Konfiguration so zu ändern, dass stattdessen anonymer Zugriff möglich ist (was in meiner Antwort nicht behandelt wird). Dennoch wähle ich manchmal tatsächlich, meine WCF-Dienste mit Windows (Kerberos) -Authentifizierung zu sichern.

+0

Vielen Dank für die Antwort und Erklärung. Ich war genau in dem gleichen Fall aber für WebHttpBinding. – AFract

0

Wie die anderen Antworten, die ich brauchte die Bindung in meinem Web.config auf diese zu aktualisieren:

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

Aber ich auch Instanziierung meine Bindung gebraucht zu aktualisieren:

var binding = new BasicHttpBinding { MaxReceivedMessageSize = 1000000, ReaderQuotas = { MaxDepth = 200 } }; 

binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows; 
binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly; 
binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName; 
11

das Hinzufügen gearbeitet für mich.

 <bindings> 
     <webHttpBinding> 
      <binding> 
       <security mode="TransportCredentialOnly"> 
        <transport clientCredentialType="Windows" /> 
       </security> 
      </binding> 
     </webHttpBinding> 
    </bindings> 
+0

Dieses hat nicht funktioniert in meinem Szenario, aber scradams Antwort tat - der einzige Unterschied scheint scradam verwendet Basichttpbinding zu sein und dies verweist webHttpBinding. Was ist der Unterschied zwischen diesen Keywords? – Jeff

+0

webHttpBinding ist für REST JSON-Dienste (in einer Webanwendung zum Beispiel), basicHttpBinding ist für SOAP. Siehe http://stackoverflow.com/questions/2650785/basichttbbinding-vs-wshttpbinding-vs-webhttpbinding oder WCF-Dokumentation über verschiedene Bindungen. – AFract

+0

Dies war, was ich brauchte - ich hatte Beispiele basierend auf SSL-Authentifizierung verwendet, und während ich Dinge geändert hatte, um den "TransportCredentialOnly" -Modus zu verwenden, erhielt immer noch die Fehlermeldungen, weil ich den ClientCredentialType auf "Basic" gesetzt hatte. Vielen Dank! –

1

Ich habe diesen Fehler beim Aktualisieren von .NET 4.0 auf .NET 4.5.2.Ich habe die ClientCredentialType von

<security mode="TransportCredentialOnly"> 
    <transport clientCredentialType="None"/> 
</security> 

zu

<security mode="TransportCredentialOnly"> 
    <transport clientCredentialType="InheritedFromHost"/> 
</security> 

jedoch Einstellung ClientCredentialType = "Windows" gleich gut funktioniert.

0

Ich hatte einen webHttpBinding hinzufügen und meinen Endpunkt zu diesem Punkt, der die Sicherheitseinstellungen zu arbeiten, benötigt. Ohne dass mein Endpunkt verwendet, um die Standard-WCF-Konfigurationsbindungen:

<services> 
    <service behaviorConfiguration="ServiceBehavior" name="Service"> 
    <endpoint address="" binding="webHttpBinding" contract="IService" /> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="ServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
<bindings> 
    <webHttpBinding> 
     <binding> 
     <!--Notice, no name attribute set--> 
     <security mode="TransportCredentialOnly"> 
      <transport clientCredentialType="Windows" /> 
     </security> 
     </binding> 
    </webHttpBinding> 

</bindings> 
0

Ich bin nicht ganz sicher, warum, aber wenn ich die ‚Factory‘ Attribut auf meine .SVC Datei hinzugefügt (Sie müssen explizit zu Visual Studio ziehen), alles nur arbeitet - ohne Änderungen auf die Standardeinstellungen in Web.config!

Ich habe Fabrik = "System.ServiceModel.Activation.WebServiceHostFactory" so meine SVC-Datei aus dieser ging:

<%@ ServiceHost Language="C#" Debug="true" Service="ServiceNameSpace.ServiceName" CodeBehind="ServiceName.svc.cs" %>

dazu:

<%@ ServiceHost Language="C#" Debug="true" Service="ServiceNameSpace.ServiceName" CodeBehind="ServiceName.svc.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

Die Einziger Nebeneffekt scheint zu sein, dass wenn Sie auf die .SVC-Datei im Browser klicken, der Fehler "Endpoint not found" (Endpunkt nicht gefunden) angezeigt wird. Der Dienst funktioniert jedoch einwandfrei mach es trotzdem richtig. Wie bereits erwähnt, verwende ich eine Standard-Web.config mit .NET 4.6 (Simplified WCF configuration), so dass ich eventuell noch Details zum Endpunkt hinzufügen muss, damit es wieder funktioniert.