2013-03-07 15 views
17

Otrzymuję następujący błąd, gdy ustawiłem Włącz uwierzytelnianie systemu Windows i anonimowe wyłączone w IIS.Uczyń Wcf Service IntegratedWindowsAuthentication

Systemy uwierzytelniania, skonfigurowane w gospodarzu ('IntegratedWindowsAuthentication') nie pozwalają skonfigurowanych na wiązanie 'BasicHttpBinding' ('Anonymous'). Należy upewnić się, żeSecurityMode jest ustawiony na Transport lub TransportCredentialOnly. Dodatkowo ten może zostać rozwiązany poprzez zmianę uwierzytelniania programów dla tej aplikacji za pośrednictwem narzędzia zarządzania IIS, dzięki właściwość ServiceHost.Authentication.AuthenticationSchemes, w pliku konfiguracyjnym aplikacji na elemencie , aktualizując właściwość ClientCredentialType na powiązanie lub dostosowanie właściwości AuthenticationScheme w obiekcie HttpTransportBindingElement w wersji . web.config

My usługi WCF jest następujący ...

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

rada proszę ..

+0

Nie opublikowałeś swojego pliku web.config ... – Tim

+0

Jest już gotowy. proszę o poradę. – user214471

+0

Nie widzę definicji usługi w konfiguracji, tylko klienta. Jeśli jest to plik konfiguracyjny Twojej usługi i korzystasz z .NET 4.0+, istnieje szansa, że ​​otrzymujesz domyślny punkt końcowy, który może nie mieć prawidłowo ustawionych zabezpieczeń. Musisz również przypisać powiązanie utworzone w pliku konfiguracyjnym do swojej usługi. – Tim

Odpowiedz

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

się rozwiązać mój problem.

39

W .Net 4.0+, Simplified WCF configuration używa konfiguracji "anonimowych", gdy konfiguracje nie są jawnie ustawione dla poszczególnych usług w sekcji < usługi >. Jeśli usuniesz nazwę = "BasicHttpEndpointBinding" z elementu < wiążącego > lub jeśli powielicie ten element < jako nowy element bez atrybutu name, stanie się on domyślnym, anonimowym powiązaniem, z którego będą korzystać usługi WCF. Jest to często przydatne w przypadkach, w których trzeba służyć, a także korzystać z usług WCF, które mogą nie mieć tej samej konfiguracji - ale przynajmniej można ustawić domyślną konfigurację dla usług, które nie mają określonego zestawu konfiguracyjnego. Domyślna/anonimowa koncepcja ma również zastosowanie do elementów <.

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

Ponadto dodam, że jeśli usługi WCF wymaga uwierzytelnienia, oznacza to, że będzie to albo trzeba konsumować usługę za pomocą prawdziwe konto użytkownika, albo trzeba będzie przyznać się nazwa_komputera_klienckiego $ konto domena \ dostęp do usługi - więc być może właściwym rozwiązaniem dla wielu osób może być zmiana konfiguracji, aby zamiast tego umożliwić anonimowy dostęp (co nie jest omówione w mojej odpowiedzi). Mimo to czasami wybieram zabezpieczenie moich usług WCF za pomocą uwierzytelniania systemu Windows (Kerberos).

+0

Dziękujemy za odpowiedź i wyjaśnienie. Byłem dokładnie w tym samym przypadku, ale dla webHttpBinding. – AFract

0

Podobnie jak inne odpowiedzi, o konieczności aktualizacji wiązania w moim Web.config do tego:

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

Ale Musiałem także zaktualizować instancji wiązania to:

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

Dodawanie to działało dla mnie.

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

Ten nie działał w moim scenariuszu, ale odpowiedziała na scradam - jedyna różnica wydaje się być scradam używa basicHttpBinding i odnosi się do webHttpBinding. Jaka jest różnica między tymi słowami kluczowymi? – Jeff

+0

webHttpBinding jest dla usług REST JSON (na przykład w aplikacji internetowej), basicHttpBinding dla SOAP. Zobacz http://stackoverflow.com/questions/2650785/basichttpbinding-vs-wshttpbinding-vs-webhttpbinding lub dokumentację WCF na temat różnych powiązań. – AFract

+0

To było to, czego potrzebowałem - używałem przykładów opartych na uwierzytelnianiu typu SSL i podczas gdy zmieniłem rzeczy, aby używać trybu "TransportCredentialOnly", wciąż otrzymywałem komunikaty o błędach, ponieważ ustawiłem parametr clientCredentialType na "Basic". Dzięki! –

1

Wystąpił ten błąd podczas aktualizacji z .NET 4.0 do .NET 4.5.2.Zmieniłem clientCredentialType z

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

do

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

Jednak ustawienie clientCredentialType = "Windows" działa równie dobrze.

0

Dodałem webHttpBinding i wskazałem mój punkt końcowy, który wymagał ustawienia zabezpieczeń. Bez tego mój końcowy użyty domyślny config WCF powiązań:

<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

Nie jestem do końca pewien dlaczego, ale gdy dodaje atrybut do „fabryki” do mojego pliku .SVC (trzeba wyraźnie przeciągnij go do Visual Studio), wszystko tylko działa - bez żadnych zmian w ustawieniach domyślnych w pliku Web.config!

dodałem Fabrycznie = "System.ServiceModel.Activation.WebServiceHostFactory" więc mój plik .SVC poszedł z tego:

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

do tego:

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

Jedynym efektem ubocznym wydaje się, że po kliknięciu pliku .SVC w przeglądarce pojawia się błąd "Nie znaleziono punktu końcowego", ale usługa działa dobrze, gdy mimo to właściwie to wygrałem. Jak wspomniano wcześniej, używam domyślnego Web.config z .NET 4.6 (Simplified WCF configuration), więc być może będę musiał dodać szczegóły punktu końcowego, aby ponownie zadziałały.

Powiązane problemy