2009-08-13 39 views
7

tôi đã một số mã mà cố gắng mạo danh các thiết lập người gọi cửa sổ an ninh và sau đó kết nối với một dịch vụ WCF trên một máy khác nhauWCF lỗi cửa sổ xác thực an ninh

WindowsIdentity callerWindowsIdentity = ServiceSecurityContext.Current.WindowsIdentity; 
using (callerWindowsIdentity.Impersonate()) 
{ 
    NetTcpBinding binding = new NetTcpBinding(); 
    binding.Security.Mode = SecurityMode.Message; 
    binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows; 
    EndpointAddress endpoint = new EndpointAddress(new Uri("net.tcp://serverName:9990/TestService1")); 
    ChannelFactory<WCFTest.ConsoleHost.IService1> channel = new ChannelFactory<WCFTest.ConsoleHost.IService1>(binding, endpoint); 
    WCFTest.ConsoleHost.IService1 service = channel.CreateChannel(); 
    return service.PrintMessage(msg); 
} 

Nhưng tôi nhận được lỗi: "người gọi là không được xác thực bởi dịch vụ " System.ServiceModel .... Yêu cầu mã thông báo bảo mật không thể được đáp ứng vì xác thực không thành công ...

Thông tin đăng nhập tôi đang cố mạo danh là xác thực cửa sổ valide cho hộp dịch vụ đang bật .

Mọi ý tưởng tại sao?

Trả lời

0

Mạo danh từ dịch vụ của bạn đến tiếp theo là một vấn đề phức tạp, được gọi là vấn đề "double-hop".

Tôi không có câu trả lời cuối cùng cho điều đó (tôi thường tránh nó bằng cách sử dụng tài khoản dịch vụ rõ ràng cho dịch vụ cần gọi cho một dịch vụ khác).

NHƯNG: bạn chắc chắn nên xem WCF Security Guidance trên CodePlex và tìm kiếm "Mạo danh" - có một số bài viết giải thích tất cả các thông tin mạo danh người gọi ban đầu và tại sao nó phức tạp.

Marc

1

Đồng ý với marc_s đây là sự cố kép-hop.

Bạn cần phải nhận được cửa sổ xác thực tất cả các cách thức thông qua, do đó:

  • Yêu cầu phải được thực hiện trong bối cảnh của một người sử dụng cửa sổ
  • IIS phải được cấu hình để sử dụng cửa sổ xác thực
  • Web.config phải được thiết lập để xác thực cửa sổ với mạo danh = true
  • Người dùng mà hồ bơi ứng dụng của bạn đang chạy, phải được phép mạo danh người dùng. Đây là nơi thông thường xảy ra sự cố double-hop.

Có quyền gọi là "Mạo danh một khách hàng sau khi xác thực"

http://blogs.technet.com/askperf/archive/2007/10/16/wmi-troubleshooting-impersonation-rights.aspx

0

Nếu bạn chắc chắn có các chứng chỉ đúng trên cả hai bước nhảy, điều tiếp theo mà thể được gây ra vấn đề là thiếu EndpointDnsIdentity được thiết lập trên điểm cuối.

DnsEndpointIdentity identity = new DnsEndpointIdentity("localhost"); // localhost is default. Change if your service uses a different value in the service's config. 
Uri uri = new Uri("net.tcp://serverName:9990/TestService1"); 
endpoint = new EndpointAddress(uri, identity, new AddressHeaderCollection()); 
3

Để hỗ trợ kịch bản của bạn, bạn cần phải có một sự hiểu biết về cách Protocol TransitionConstrained Delegation làm việc. Bạn sẽ cần phải cấu hình cả Active Directory và điểm cuối dịch vụ WCF của bạn để hỗ trợ điều này. Lưu ý việc sử dụng Tên dịch vụ chính (SPN). Hãy xem liên kết sau và xem họ có giúp bạn không. Bài viết có một mẫu để chứng minh cấu hình đầu cuối hoàn chỉnh cần thiết để thực hiện công việc này.

How To: Impersonate the Original Caller in WCF Calling from a Web Application