2010-09-16 32 views
6

Tôi nhận được lỗi "Không có điểm cuối nghe tại net.pipe: // localhost" như được mô tả ở các địa điểm khác nhưng tôi dường như không tìm thấy câu trả lời thực sự.Đặt SPN trên địa chỉ điểm cuối cho điểm cuối dịch vụ NetNamedPipe

Đây là một định danh lớn của vấn đề: http://kennyw.com/indigo/102

Khi sử dụng WCF, Windows authentication được thực hiện thông qua SSPI-Negotiate, mà trong nhiều trường hợp sẽ chọn Kerberos như cơ chế xác thực thực tế . Tuy nhiên, nếu mục tiêu SPN truyền cho SSPI là một cũng được hình thành SPN cho tài khoản máy tính cục bộ (ví dụ host/[tên máy dns]) sau đó Negotiate sẽ sử dụng NTLM (loopback tối ưu hóa) và access token sẽ không có SID mạng (và do đó sẽ có thể sử dụng được với NetNamedPipes).

Nhưng nó không cho tôi biết cách giải quyết vấn đề. Tôi đang tạo điểm cuối của mình theo lập trình.

var binding = new NetNamedPipeBinding(); 
binding.Security.Mode = NetNamedPipeSecurityMode.Transport; 
binding.Security.Transport.ProtectionLevel = ProtectionLevel.EncryptAndSign; 

var id = EndpointIdentity.CreateSpnIdentity("host/" + Environment.MachineName); 
var endpointAddress = new EndpointAddress(new Uri(serviceClientUrl), id); 

var client = new ServiceClient(binding, endpointAddress); 

Tôi đoán rằng sự cố của tôi nằm trong CreateSpnIdentity nhưng tôi không chắc chắn nên sử dụng giá trị nào.

Thông tin bổ sung: Để giải thích thêm về ngữ cảnh này. Dịch vụ Wcf được lưu trữ dưới dạng Dịch vụ Windows đang chạy trong tài khoản NetworkService (Tôi đã thử Hệ thống cục bộ). Dịch vụ được tạo bằng cách sử dụng hàm tạo NetNamedPipeBinding mặc định:

host.AddServiceEndpoint(typeof(IService), new NetNamedPipeBinding(), "ServiceName"); 

Tôi đã tạo một webpart SharePoint sử dụng dịch vụ này. Các kicker là nếu trang SharePoint được thiết lập để xác thực dựa trên biểu mẫu hoặc chỉ tên máy được sử dụng trong url dưới Windows Authentication thì không có vấn đề gì. CHỈ nếu tên máy hoàn toàn đủ điều kiện được sử dụng cho url trong xác thực Windows để tôi nhận được lỗi ở trên.

Tôi khá chắc chắn điều này có liên quan đến các vấn đề về Kerberos NTLM được khắc phục trong bài viết nhưng tôi không chắc chắn cách thực hiện.

Trả lời

3

Đặt danh tính điểm cuối ở phía máy khách sẽ không giúp bạn, vì vấn đề là ngữ cảnh bảo mật mà mã máy khách của bạn đang thực thi chứ không phải cấu hình của điểm cuối. Là KennyW explains, nếu bạn truy cập vào ứng dụng SharePoint bằng tên miền đầy đủ của máy, mã thông báo mạo danh trong quy trình máy chủ web (cung cấp thông tin nhận dạng người dùng SharePoint của bạn trong xác thực Windows) sẽ nhận được qua Kerberos và có tư cách thành viên của nhóm NGƯỜI DÙNG MẠNG . Nếu bạn chỉ sử dụng tên máy, tối ưu hóa Kenny đề cập đến bạn là mã thông báo đăng nhập qua NTLM không có trong nhóm NGƯỜI DÙNG MẠNG và do đó không bị từ chối truy cập bởi ACL mà WCF đặt cả trên đường ống và trên đối tượng bộ nhớ dùng chung nơi máy chủ xuất bản tên đường ống thực tế.

Lỗi There was no endpoint listening at net.pipe://localhost... không nhất thiết có nghĩa là không có dịch vụ WCF nghe trên đầu cuối ống được đặt tên như vậy: nó cũng có thể (và trong trường hợp này) có nghĩa là mặc dù có một, bạn không có đủ quyền truy cập để biết về nó, bởi vì bạn có một đăng nhập từ xa.

+0

Vâng, tôi đã nhận ra rằng Net Tcp thực sự là giải pháp duy nhất của tôi (điều này là tốt bởi vì cuối cùng chúng tôi sẽ chuyển dịch vụ này sang một máy khác). Cảm ơn thông tin chi tiết và liên kết. – webwires

2

NamedPipe đã được thực hiện một cơn đau ở mặt sau sau khi Hardening: http://msdn.microsoft.com/en-us/library/bb757001.aspx Nó thực sự làm cho tôi thay đổi từ NamedPipe thành TCP trong khi tôi cần giao tiếp trên cùng một máy.

Điều này không có nghĩa đây là vấn đề của bạn. Nếu bạn đang chạy dưới một tài khoản và cố gắng kết nối dưới một tài khoản khác, điều này thường sẽ thất bại vì các đường ống được đặt tên không còn được tạo thành toàn cầu (trừ khi nó là LocalSys).

Đề xuất của tôi là:

1) Loại bỏ tất cả bảo mật khỏi dịch vụ của bạn. Sau khi tất cả, NamedPipe chạy trên cùng một máy và tôi tin rằng thông thường không cần bảo mật. 2) Thử kết nối. nếu nó không thành công, sử dụng SysInternals ProcExplorer để xem những gì các quá trình đối tượng đã bắt đầu. Nếu nó có một đường ống có tên thì nó là cứng.

Nếu bạn cung cấp thêm thông tin, tôi có thể giúp bạn nhiều hơn.

+0

Dịch vụ được lưu trữ trong Dịch vụ Windows chạy dưới NT AUTHORITY \ NetworkService. Máy khách là SharePoint WebPart với SharePoint đang chạy tài khoản dịch vụ mạng. Nếu tôi truy cập máy cục bộ và chỉ sử dụng tên máy làm url thì nó hoạt động tốt. Nếu tôi thêm tên miền đủ điều kiện vào url thì nó sẽ không hoạt động. Tôi biết điều này đã làm với thực tế là các trang web được thiết lập để bảo mật cửa sổ bởi vì mã này hoạt động mà không có vấn đề cho các trang SharePoint khác được đặt thành FBA. – webwires

+0

Tôi đã kết thúc nhận được một mùa thu trở lại bằng cách sử dụng Net Tcp làm việc nhưng tôi thực sự muốn giải quyết câu đố này. – webwires

+0

Có một số tiền hợp lý của thông tin sai lạc trong câu trả lời này: (1) Sửa chữa hệ điều hành có tên là đường ống là tốt và cần thiết để loại bỏ các lỗ hổng bảo mật; (2) WCF vẫn tạo ra các đường ống được đặt tên trong không gian tên chung: đó là bộ nhớ chia sẻ xuất bản tên đường dẫn tới các máy khách sẽ đi vào Local (ví dụ: scoped bởi session logon) thay vì namespace toàn cầu nếu máy chủ không đủ đặc quyền (trên Vista) và W7). Vấn đề ở đây là không có gì để làm với một trong những điều này - đó là do WCF từ chối truy cập đến các điểm cuối đường ống được đặt tên để đăng nhập từ xa. –

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