2013-03-07 10 views
17

Tôi gặp phải lỗi sau khi tôi đã đặt tính năng Xác thực Windows cho phép và vô danh để tắt trong IIS.Thực hiện dịch vụ Wcf IntegratedWindowsAuthentication

Các lược đồ xác thực cấu hình trên máy chủ ('IntegratedWindowsAuthentication') không cho phép những cấu hình trên các ràng buộc 'BasicHttpBinding' ('Anonymous'). Hãy đảm bảo rằng SecurityMode được đặt thành Giao thông vận tải hoặc TransportCredentialOnly. Ngoài ra, điều này có thể được giải quyết bằng cách thay đổi xác thực lược đồ cho ứng dụng này thông qua công cụ quản lý IIS, thông qua thuộc tính ServiceHost.Authentication.AuthenticationSchemes, trong tệp cấu hình ứng dụng tại phần tử , bằng cách cập nhật thuộc tính ClientCredentialType trên ràng buộc hoặc bằng cách điều chỉnh thuộc tính AuthenticationScheme trên HttpTransportBindingElement. web.config

WCF Service của tôi là như sau ...

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

lời khuyên hãy ..

+0

Bạn chưa đăng web.config của mình ... – Tim

+0

Sẵn sàng ngay bây giờ. làm ơn cho lời khuyên. – user214471

+0

Tôi không thấy định nghĩa dịch vụ trong cấu hình của bạn, chỉ là một khách hàng. Nếu đây là tệp cấu hình dịch vụ của bạn và bạn đang sử dụng .NET 4.0+, rất có thể bạn đang nhận được điểm cuối mặc định, có thể không có bộ bảo mật đúng cách. Bạn cần phải gán ràng buộc bạn tạo trong tệp cấu hình của bạn vào dịch vụ của bạn. – Tim

Trả lời

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

Nó giải quyết vấn đề của tôi.

39

Trong .Net 4.0+, Simplified WCF configuration sử dụng cấu hình 'ẩn danh' khi cấu hình không được đặt rõ ràng trên cơ sở từng dịch vụ trong phần < dịch vụ >. Nếu bạn xóa tên = "BasicHttpEndpointBinding" khỏi phần tử < ràng buộc > hoặc nếu bạn nhân đôi phần tử < ràng buộc > làm phần tử mới không có thuộc tính tên, nó sẽ trở thành liên kết mặc định, ẩn danh mà các dịch vụ WCF của bạn sẽ sử dụng. Điều này thường hữu ích trong trường hợp bạn cần phải phục vụ cũng như tiêu thụ các dịch vụ WCF có thể không có cùng cấu hình - nhưng ít nhất bạn có thể đặt cấu hình mặc định cho các dịch vụ không có tập cấu hình cụ thể. Khái niệm mặc định/ẩn danh cũng được áp dụng cho các yếu tố < hành vi >.

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

Ngoài ra, tôi có thể nói thêm rằng nếu các dịch vụ WCF của bạn yêu cầu xác thực, điều này có nghĩa rằng bạn sẽ có cần phải tiêu thụ các dịch vụ sử dụng một tài khoản người dùng thực sự, hoặc bạn sẽ cần phải cấp các DOMAIN \ CLIENTCOMPUTERNAME $ tài khoản truy cập vào dịch vụ - vì vậy, có lẽ giải pháp thích hợp cho nhiều người có thể thay đổi cấu hình để thay thế cho phép truy cập ẩn danh (không được thảo luận trong câu trả lời của tôi). Tuy nhiên, đôi khi tôi thực sự chọn bảo mật các dịch vụ WCF của mình bằng xác thực Windows (Kerberos).

+0

Cảm ơn bạn đã trả lời và giải thích. Tôi đã chính xác trong trường hợp tương tự nhưng đối với webHttpBinding. – AFract

0

Giống như câu trả lời khác, tôi cần phải cập nhật các ràng buộc trong Web.config của tôi như thế này:

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

Nhưng tôi cũng cần phải cập nhật instantiation ràng buộc của tôi:

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

Thêm này làm việc cho tôi.

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

Điều này đã không làm việc trong kịch bản của tôi, nhưng scradams trả lời đã làm - sự khác biệt duy nhất có vẻ là scradam sử dụng basicHttpBinding và tham khảo này webHttpBinding. Sự khác nhau giữa các từ khóa này là gì? – Jeff

+0

webHttpBinding dành cho các dịch vụ REST JSON (trong một ứng dụng web chẳng hạn), basicHttpBinding là dành cho SOAP. Xem http://stackoverflow.com/questions/2650785/basichttpbinding-vs-wshttpbinding-vs-webhttpbinding hoặc tài liệu WCF về các ràng buộc khác nhau. – AFract

+0

Đây là những gì tôi cần - Tôi đã sử dụng các ví dụ dựa trên xác thực kiểu SSL, và trong khi tôi đã thay đổi mọi thứ để sử dụng chế độ "TransportCredentialOnly", vẫn nhận được thông báo lỗi vì tôi đã đặt clientCredentialType thành "Basic". Cảm ơn! –

1

Tôi gặp lỗi này khi cập nhật từ .NET 4.0 lên .NET 4.5.2.Tôi đã thay đổi clientCredentialType từ

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

để

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

Tuy nhiên, thiết lập clientCredentialType = "Windows" làm việc tốt như nhau.

0

Tôi đã thêm webHttpBinding và trỏ điểm cuối của mình vào đó, cài đặt bảo mật cần thiết để hoạt động. Mà không có thiết bị đầu cuối của tôi sử dụng WCF mặc định ràng buộc cấu hình:

<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

Tôi không hoàn toàn chắc chắn lý do tại sao, nhưng khi tôi thêm thuộc tính 'Nhà máy' để tập .SVC của tôi (bạn cần phải kéo một cách rõ ràng để Visual Studio), mọi thứ chỉ cần hoạt động - mà không có bất kỳ thay đổi nào đối với cài đặt mặc định trong Web.config!

tôi thêm Factory = "System.ServiceModel.Activation.WebServiceHostFactory" nên tập .SVC của tôi đã đi từ này:

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

này:

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

Các chỉ có tác dụng phụ có vẻ là khi bạn nhấp vào tệp .SVC trong trình duyệt, bạn sẽ gặp lỗi 'Không tìm thấy điểm cuối', nhưng dịch vụ hoạt động tốt khi bạn tham gia voke nó một cách chính xác anyway. Như đã đề cập trước đó, tôi đang sử dụng Web.config mặc định với .NET 4.6 (Simplified WCF configuration), vì vậy tôi có thể chưa thêm chi tiết điểm cuối để làm việc lại.