2008-12-18 38 views
6

Tôi đang làm việc trên một dự án mà tôi cần những điều sau đây.Tên người dùng WCF không có giấy chứng nhận

  • dịch vụ WCF trên phía máy chủ (.NET 3.5)
  • WPF client cho các mặt hàng khác (NET 3,0)

Tôi có một ứng dụng hiện tại mà tôi phải sử dụng xác thực và ủy quyền từ (ở phía máy chủ). Tôi cũng cần lưu trữ một số siêu dữ liệu về người dùng trong Chủ đề chính của Dịch vụ WCF (một đối tượng trang web). Tôi làm điều này để tôi có thể nhận được nó trong dịch vụ WCF nếu tôi hoàn toàn phải; một số logic kinh doanh có thể yêu cầu nó. Vì vậy, kế hoạch của tôi là làm như sau ...

Tạo một ServiceAuthorizationManager tùy chỉnh cho máy chủ và trong đó tôi sẽ đăng nhập vào người dùng và nhận vai trò từ ứng dụng hiện có. Tôi sẽ cache đối tượng "Site", và khi các yêu cầu tiếp tục kéo ra từ cache. Tôi cũng sẽ cần một đối tượng CustomPrincipal để giữ dữ liệu tùy chỉnh của mình. Tôi muốn mạo danh người dùng vì vậy mà tôi có thể sử dụng vai trò xây dựng trong lọc trong WCF như thế này:

[PrincipalPermission(SecurityAction.Demand, Role = "Role1")] 
public string[] RolesForUser(string username){} 

Tôi đã cố gắng sử dụng ủy quyền ASP.NET với một nhà cung cấp vai trò tùy chỉnh, nhưng tôi đã không thể thiết lập bất cứ điều gì trên Hiệu trưởng hiện tại. Tôi cũng đã cố gắng sử dụng một IAuthorizationPolicy tùy chỉnh, nhưng vấn đề phát sinh. Những vấn đề này xử lý với việc có thể sử dụng ứng dụng WCFClient.exe, khi nó được phát hiện (bằng cách sử dụng mex endpoing) nó sẽ không cung cấp bất kỳ thông tin đăng nhập nào, vì vậy thông tin đăng nhập sẽ thất bại. Cuối cùng tôi đã quyết định rằng ServiceAuthorizationManager là một cách đúng đắn để đi, nhưng tôi mở cho các đề xuất khác.

Trên máy khách, tôi sẽ thu thập thông tin đăng nhập và đưa chúng vào lớp proxy WCF, như sau.

proxy.ChannelFactory.Credentials.UserName.UserName = userName; 
proxy.ChannelFactory.Credentials.UserName.Password = password; 

Khi tôi bắt đầu đi xuống tuyến đường này, tôi nhận thấy rằng tôi không thể nhận tên người dùng/mật khẩu trong phương thức CheckAccessCore của lớp người quản lý của tôi. Điều tra thêm cho thấy rằng tôi thực sự nên được xác thực trong một UserNamePasswordValidator tùy chỉnh. Vì vậy, tôi đã tạo ra một trong số đó. Vấn đề là phương pháp xác thực không bao giờ được gọi.

Điều tra thêm cho thấy rằng để phương thức xác thực được gọi là dịch vụ WCF của tôi phải có bảo mật mức tin nhắn hoặc vận chuyển. Vấn đề với điều đó là tôi không thể tìm ra cách để có một tin nhắn hoặc bảo mật mức vận chuyển mà không có chứng chỉ X.509. Sản phẩm này đang đi vào hàng trăm máy vô cùng bị khóa và không thể cài đặt chứng chỉ.

Có cách nào để làm những gì tôi hỏi mà không cần cài đặt chứng chỉ không?

Trả lời

6

Câu trả lời ngắn; bạn không thể. Ngay sau khi bạn sử dụng tên người dùng/mật khẩu, bạn cần một số loại kênh an toàn.

Tuy nhiên, bạn không cần chứng chỉ trên máy khách; chỉ trên máy chủ.

22

Thực tế nó có thể, nhưng bạn sẽ cần phải thực hiện ràng buộc của riêng bạn.

Yaron Naveh đã phát triển liên kết WCF cho phép tên người dùng/mật khẩu văn bản rõ ràng qua HTTP. article của ông bao gồm mã cho ràng buộc.

1

Tôi không biết chi tiết về cơ sở hạ tầng mạng của bạn, nhưng nếu bạn đang ở trong miền Windows, bạn nên cân nhắc sử dụng thông tin đăng nhập Windows.

Có thể sử dụng bảo mật Thư mà không có chứng chỉ nếu bạn sử dụng thông tin đăng nhập Windows. Đây là hành vi mặc định của wsHttpBinding (ngoài hộp).

Sử dụng giải pháp ngoài hộp (không triển khai ràng buộc của riêng bạn) WCF khuyến khích (yêu cầu) bạn sử dụng kênh bảo mật bất cứ khi nào thông tin xác thực được bao gồm trong thư.

Sử dụng liên kết tùy chỉnh cho phép bạn chỉ định thông tin xác thực bằng văn bản rõ ràng chắc chắn là giải pháp, nhưng tôi sẽ suy nghĩ kỹ trước khi sử dụng.

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