2009-08-03 13 views
9

Tôi có một ứng dụng điều khiển máy nơi tôi có một máy khách và năm hộp máy chủ giao tiếp trên mạng con của máy. Không có bộ điều khiển miền. Tôi muốn sử dụng netTcpBinding để cho phép hỗ trợ độ tin cậy và giao dịch.netTcpBinding không có thông tin đăng nhập Windows?

Có thể sử dụng xác thực tên người dùng/mật khẩu với ràng buộc này không, khi bộ điều khiển miền không có mặt? Tôi không muốn sử dụng chứng chỉ vì tôi không muốn quản lý chứng chỉ trên 900 máy tính (150 máy) sẽ không được kết nối với mạng LAN văn phòng.

Trả lời

10

Có, tất nhiên - nhưng chỉ khi bạn sử dụng Bảo mật thư (thay vì bảo mật truyền tải). Xác định cấu hình ràng buộc của bạn như vậy:

<netTcpBinding> 
    <binding name="UserNameSecurity"> 
     <security mode="Message"> 
     <message clientCredentialType="UserName"/> 
     </security> 
    </binding> 
    </netTcpBinding> 

và sau đó tham khảo mà ràng buộc cấu hình trong thiết bị đầu cuối của bạn (trên máy chủ và máy khách):

<endpoint address="....." 
      binding="netTcpBinding" 
      bindingConfiguration="UserNameSecurity" 
      contract="IMyService" /> 

Marc

UPDATE:
Ah, vâng, ở phía máy chủ, bạn sẽ cần một chứng chỉ để tự động dịch vụ cho khách hàng đang gọi nó, và nó cũng được sử dụng để mã hóa + ký các tin nhắn. Đó là trên máy chủ chỉ - khách hàng không cần phải cài đặt bất cứ điều gì.

Cấu hình:

<behaviors> 
    <serviceBehavior> 
    <behavior name="ServerInternet"> 
     <serviceCredentials> 
     <serviceCertificate 
      findValue="MyServiceCertificate" 
      storeLocation="LocalMachine" 
      storeName="My" 
      x509FindType="FindBySubjectName" /> 
     </serviceCredentials> 
    </behavior> 
    </serviceBehavior> 
</behaviors> 
<services> 
    <service name="MyServiceInternet" 
      behaviorConfiguration="ServerInternet"> 
    .... 
    </service> 
</services> 

Hãy chắc chắn để cài đặt chứng chỉ của máy chủ vào "máy địa phương" thư mục trên máy chủ của bạn, theo "tên chủ đề" mà bạn chỉ định trong cấu hình của bạn.

+0

Vì vậy, đó là những gì tôi có ban đầu. Nhưng, tôi nhận được một ngoại lệ yêu cầu chứng chỉ dịch vụ: "Chứng chỉ dịch vụ không được cung cấp. Chỉ định chứng chỉ dịch vụ trong ServiceCredentials." Bất kỳ ý tưởng nào? –

+0

Hmmm. Đó là những gì tôi nghi ngờ. Cảm ơn bạn đã xác nhận. –

+0

Trong phương pháp này là có bất kỳ tác hại của việc sử dụng một cert tự ký trong môi trường sản xuất? Nếu nó chỉ được sử dụng để mã hóa tin nhắn chứ không phải để xác minh danh tính. Khi nào bạn không sử dụng tự ký-cert để mã hóa tin nhắn? – Vitalik

0

Có điều gì đó bạn có thể thử trước tiên. Đặt serviceNegotiationCredentials thành true:

<message negotiateServiceCredential="true"/> 

Điều này sẽ tạo cuộc trò chuyện an toàn giữa khách hàng và dịch vụ của bạn mà không có bộ điều khiển miền.

NHƯNG, nếu không có bất kỳ bộ điều khiển miền nào, máy khách không tin tưởng dịch vụ của bạn, vì vậy nó sẽ không thành công.

Vì vậy, bạn nên đặt dự kiến ​​identity of the service. Bạn có thể tìm thấy điều đó trong WSDL của dịch vụ của bạn. Theo mặc định, nếu bạn đang lưu trữ trên IIS, nó có vẻ là:

<client> 
    <endpoint> 
     <identity> 
      <servicePrincipalName value="host/NETWORKSERVICE"></servicePrincipalName> 
     </identity> 
    </endpoint> 
</client> 

Tôi không nghĩ rằng bạn sẽ cần đến nó, nhưng có lẽ bạn sẽ phải cho phép đăng nhập vô danh ở phía bên dịch vụ:

<serviceBehaviors> 
    <behavior> 
     <serviceCredentials> 
      <windowsAuthentication allowAnonymousLogons="true"/> 
     </serviceCredentials> 
    </behavior> 
</serviceBehaviors> 
+1

Cảm ơn. Tôi nghĩ rằng negotiateServiceCredential không tồn tại cho netTcpBinding. Tôi có thể sẽ đi xuống đường dẫn chứng chỉ, vì điều đó có vẻ (tương đối) thẳng về phía trước. –