2009-05-14 33 views
7

Tôi đã viết một Ứng dụng đơn giản sử dụng WCF để giao tiếp giữa máy khách và máy chủ. Khi tôi chạy nó cục bộ nó hoạt động tốt, tuy nhiên khi tôi chạy máy chủ và máy khách trên hai hộp khác nhau, tôi nhận được ngoại lệ sau:Đặt thông tin xác thực cho ứng dụng WCF?

Unexpected error occured, while getting the group names from the VDN server 
System.ServiceModel.Security.SecurityNegotiationException: The server has rejected the client credentials. 
System.Security.Authentication.InvalidCredentialException: The server has rejected the client credentials. 
System.ComponentModel.Win32Exception: The logon attempt failed 

Thông tin đăng nhập nào không được chấp nhận? Và làm thế nào tôi có thể đặt chúng?

Có cách nào để định cấu hình máy chủ để không yêu cầu xác thực không? Ứng dụng này là một ứng dụng giám sát đơn giản để bảo mật không thực sự là một vấn đề.

Xin lỗi về việc không cụ thể: Ứng dụng sử dụng proxy ống và không có tệp cấu hình wcf nào được mã hóa bằng tay.

đang WCF của tôi là dựa trên mã trong hướng dẫn này: http://www.switchonthecode.com/tutorials/wcf-tutorial-basic-interprocess-communication

Tôi không konw nó là proctice tiêu chuẩn để tạo ra các lớp WCF từ một cấu hình cho đến sau khi tôi đã viết tất cả các mã kết thúc. Bây giờ bất cứ khi nào tôi nhìn vào một tài liệu hướng dẫn/trợ giúp họ sử dụng mã được tạo ra và mọi thứ đều yêu cầu thay đổi cấu hình.

Tôi không có băng thông (tôi đang tung 3 dự án) để thay thế thành phần wcf bằng một mã được tạo ra nhưng tôi sẽ đảm bảo sử dụng tạo mã lần sau khi tôi sử dụng wcf.

+0

Tôi nghĩ bạn cần cụ thể hơn. Bạn đang sử dụng cái gì? –

Trả lời

5

Tạo một phương pháp như thế này ...

void SetImpersonation(ref IServiceClient proxy) 
{ 
    proxy.ClientCredentials.Windows.ClientCredential.Domain = "MYDOMAIN"; 
    proxy.ClientCredentials.Windows.ClientCredential.UserName = "A_USER"; 
    proxy.ClientCredentials.Windows.ClientCredential.Password = "P4SSW0RD"; 
} 

và gọi nó là khi bạn tạo lớp khách hàng mới.

IServiceClient proxy = new IServiceClient(); 
SetImpersonation(ref proxy); 

Obvously, đây là thiết lập các thông tin trở thành một người dùng cụ thể, và có ý nghĩa quan an ninh nếu mã của bạn được dịch ngược, nhưng nó phải làm việc trong (kịch bản tập tin ít config) của bạn

+0

Tôi có thể di chuyển các giá trị đó vào app.config. Tôi chỉ không có một tập tin cấu hình cho mã wcf. Cảm ơn mặc dù có vẻ tốt. –

+0

làm cách nào để tránh cài đặt điều này trong mọi ứng dụng của khách hàng? Có cách nào để thiết lập này cho tất cả các khách hàng trong giải pháp của tôi? – SomeRandomName

11

Đây là giải pháp tôi tìm thấy trong tìm kiếm để tắt bảo mật/xác thực wcf.

Từ MSDN:

WSHttpBinding b = new WSHttpBinding(); 

b.Security.Mode = SecurityMode.None; 

hoặc thêm như sau trong cấu hình:

<wsHttpBinding> 

    <binding name="myBinding"> 

     <security mode="None" /> 

    </binding> 

</wsHttpBinding> 
+0

Bạn phải cẩn thận nhảy để sử dụng giải pháp này vì ngoại lệ ban đầu có thể xuất phát từ cấu hình ràng buộc sử dụng Xác thực Windows. Trong trường hợp đó, việc loại bỏ bảo mật một cách mù quáng là một ý tưởng tồi. Kiểm tra câu trả lời của tôi ở phía dưới trong trường hợp sử dụng Xác thực Windows. – atconway

+0

Làm việc tốt, cảm ơn :) –

1

Nếu bạn là sử dụng một cấu hình WCF ràng buộc với bảo mật sau:

<transport clientCredentialType="Windows" /> 

sau đó bạn sẽ cần phải thiết lập một cách rõ ràng Credentials Windows trên dụ WCF tạo trong mã như dưới đây:

'Create an instance of the WCF service  
Dim MyService As New MyWCFServiceClient 

'Build credentials object for which this WCF call will be made 
MyService.ClientCredentials.Windows.ClientCredential = New System.Net.NetworkCredential("UserName", "Password", "DomainName") 

'Call a method on the service 
MyService.MyMethod1() 
Các vấn đề liên quan