2012-01-09 30 views
8

Tôi có thể kết nối với dịch vụ WCF của mình bằng ứng dụng hình thức Win, tuy nhiên tôi không thể làm như vậy với dịch vụ cửa sổ của mình. Bất cứ khi nào tôi bắn open() để proxy nó ném các lỗi sauMáy chủ đã từ chối thông tin đăng nhập của khách hàng, WCF là Dịch vụ Windows

Các máy chủ đã bác bỏ các thông tin khách hàng

Nội Ngoại lệ: System.Security.Authentication.InvalidCredentialException: Máy chủ đã bác bỏ các thông tin khách hàng .
---> System.ComponentModel.Win32Exception: Nỗ lực đăng nhập thất bại
--- End của nội ngoại lệ stack trace ---
tại System.Net.Security.NegoState.ProcessAuthentication (LazyAsyncResult lazyResult)
tại System.Net.Security.NegotiateStream.AuthenticateAsClient (NetworkCredential chứng chỉ, ChannelBinding ràng buộc, string targetName, ProtectionLevel requiredProtectionLevel, TokenImpersonationLevel allowedImpersonationLevel)
tại System.Net.Security.NegotiateStream.AuthenticateAsClient (NetworkCredential chứng chỉ, string targetName, Bảo vệ ionLevel requiredProtectionLevel, TokenImpersonationLevel allowedImpersonationLevel)
tại System.ServiceModel.Channels.WindowsStreamSecurityUpgradeProvider.WindowsStreamSecurityUpgradeInitiator.OnInitiateUpgrade (Stream suối, SecurityMessageProperty & remoteSecurity)

Cố gắng tìm kiếm các giải pháp, nhưng không ai phù hợp yêu cầu của tôi, vì thế đã đăng.

Xin vui lòng giúp ...

Cập nhật 1:.

@ A.R, Cố gắng sử dụng

client.ClientCredentials.Windows.AllowedImpersonationLevel = 
    System.Security.Principal.TokenImpersonationLevel.Impersonation; 

nhưng vô ích.

Cập nhật 2:

dịch vụ WCF Cấu hình

<system.serviceModel> 
    <diagnostics performanceCounters="All" /> 
    <bindings> 
     <netTcpBinding> 
     <binding name="myBindingForLargeData" maxReceivedMessageSize="5242880" maxConnections="10"> 
      <readerQuotas maxDepth="64" maxStringContentLength="5242880" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384"/> 
     </binding> 
     </netTcpBinding> 
    </bindings> 
    <services> 
     <service behaviorConfiguration="WCFService.ServiceBehavior" 
     name="WCFService.CollectorService"> 
     <endpoint address="" binding="netTcpBinding" bindingConfiguration="myBindingForLargeData" 
      name="netTcpEndPoint" contract="WCFService.ICollectorService" /> 
     <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="" 
      name="mexTcpEndPoint" contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="net.tcp://localhost:8010/WCFService.CollectorService/" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="WCFService.ServiceBehavior"> 
      <serviceMetadata httpGetEnabled="False"/> 
      <serviceDebug includeExceptionDetailInFaults="True" /> 
      <serviceThrottling 
      maxConcurrentCalls="32" 
      maxConcurrentSessions="32" 
      maxConcurrentInstances="32" 
      /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 

Trả lời

4

Cảm ơn sự giúp đỡ của bạn. tôi đã nhận được câu trả lời sau vài ngày của một số nghiên cứu và thử nghiệm phương pháp lỗi n :) tôi cũng biết tôi trễ để gửi câu trả lời, nhưng tôi nghĩ rằng nó tốt hơn muộn hơn bao giờ hết.

Vì vậy, đây là giải pháp

tôi đã phải thực hiện một số thay đổi trong các tập tin cấu hình của tôi (cả khách hàng & server)

Về phía khách hàng tôi đã thêm <security> thẻ như hình dưới đây

<system.serviceModel> 
    <bindings> 
     <netTcpBinding> 
     <binding name="netTcpEndPoint" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="5242880" maxBufferSize="5242880" maxConnections="15" maxReceivedMessageSize="5242880"> 
      <readerQuotas maxDepth="32" maxStringContentLength="5242880" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" /> 
     <security mode="Transport"> 
      <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" /> 
      <message clientCredentialType="Windows" /> 
      </security> 
     </binding> 
     </netTcpBinding> 
    </bindings> 
    <client> 
     <endpoint address="net.tcp://xx.xx.xx.xx:8010/WCFService.CollectorService/" binding="netTcpBinding" bindingConfiguration="netTcpEndPoint" contract="CloudAdapter.CloudCollectorService.ICollectorService" name="netTcpEndPoint"> 
     </endpoint> 
    </client> 
    </system.serviceModel> 

và cũng đã thêm cùng một thẻ ở phía máy chủ (cấu hình dịch vụ WCF), như được hiển thị bên dưới

<bindings> 
    <netTcpBinding> 
    <binding name="myBindingForLargeData" maxReceivedMessageSize="5242880" maxConnections="10"> 
     <readerQuotas maxDepth="64" maxStringContentLength="5242880" maxArrayLength="16384" 
        maxBytesPerRead="4096" maxNameTableCharCount="16384"/> 
     <security mode="Transport"> 
     <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" /> 
     <message clientCredentialType="Windows" /> 
     </security> 
    </binding> 
    </netTcpBinding> 
</bindings> 

Hy vọng điều này giúp đỡ một người có nhu cầu :)

Vì vậy, các KEY là làm cho thẻ <security> cùng so với khách hàng và các tập tin cấu hình máy chủ.

4

Về cơ bản những gì đang xảy ra là dịch vụ gọi điện thoại của bạn không có các thông tin thích hợp, như bạn sẽ có khi gọi từ WinForms. Những gì bạn cần là một số mạo danh. Nó mất một chút thiết lập, và là loại gây phiền nhiễu, nhưng nó sẽ làm việc.

May mắn là MSDN có một chút hướng dẫn nhỏ.
http://msdn.microsoft.com/en-us/library/ms731090.aspx

Có một số thông tin tổng quát hơn về chủ đề ở đây:
http://msdn.microsoft.com/en-us/library/ms730088.aspx

UPDATE:
Thiết cờ mạo danh là không đủ. Bạn phải thực sự mạo danh một thông tin xác thực để làm cho nó hoạt động.Ví dụ:

// Let's assume that this code is run inside of the calling service. 
    var winIdentity = ServiceSecurityContext.Current.WindowsIdentity; 
    using (var impContext = winIdentity.Impersonate()) 
    { 
    // So this would be the service call that is failing otherwise. 
    return MyService.MyServiceCall(); 
    } 
+0

Đã cập nhật Câu hỏi, vui lòng kiểm tra – Bravo

+0

OK, bạn phải thực sự cho biết đó là ai mạo danh. Bạn không thể chỉ thiết lập cờ và mong đợi nó để mạo danh một ai đó. Đọc các tài liệu được trình bày trong liên kết thứ hai. –

1

Chế độ xác thực bạn đang sử dụng trên dịch vụ WCF của bạn là gì? Có vẻ như ứng dụng winform đang chạy và cung cấp thông tin xác thực chính xác trong khi dịch vụ cửa sổ của bạn không chạy với các đặc quyền được chỉ định hoặc thông tin đăng nhập được truyền không hợp lệ. Hãy thử kiểm tra yêu cầu của bạn bằng cách sử dụng Fiddler khi được làm từ bạn winforms vs dịch vụ Windwos và thấy sự khác biệt.

+0

tôi đã cố gắng để gỡ lỗi dịch vụ Windows của tôi, và tìm thấy lỗi trên khi tôi thử mở một kết nối với khách hàng dịch vụ. BTW là gì Fiddler và là nó hữu ích trong loại kịch bản của tôi, nơi tôi có một dịch vụ WCF với ràng buộc net.tcp. xin vui lòng cho tôi biết – Bravo

+0

tôi đã không thực hiện bất kỳ bảo mật ngầm nào trên dịch vụ WCF. có thể là triển khai bảo mật mặc định. – Bravo

+0

@Bravo: Fiddler là công cụ kiểm tra lưu lượng truy cập đến và đi của bạn qua mạng. Từ cấu hình trên, dịch vụ sử dụng net.Tcp. Tôi có thể biết nếu nó được lưu trữ trong IIS hoặc tự lưu trữ? Cũng là cửa sổ dịch vụ của bạn trên một máy khác nhau? – Rajesh

1

Kiểm tra câu trả lời của tôi trên bài đăng này The server has rejected the client credentials.

Lưu ý nút bảo mật.

<bindings> 
    <netTcpBinding> 
    <binding name="customTcpBinding" maxReceivedMessageSize="20480000" transferMode="Streamed" > 
     <security mode="None"></security> 
    </binding> 
    </netTcpBinding> 
</bindings> 
+1

Điều này phù hợp với tôi –

Các vấn đề liên quan