2016-01-20 19 views
6

Tôi đang thiết kế và thử nghiệm Dịch vụ WCF và hiển thị chúng dưới dạng Dịch vụ Web SOAP.Bảo mật khác nhau cho hoạt động Dịch vụ khác nhau trong WCF

Tôi có các lớp dịch vụ của mình được chia một cách hợp lý. Tôi có dịch vụ Tài khoản. Để truy cập dịch vụ web của tài khoản, bạn phải cung cấp tên người dùng và mật khẩu cũng như mã thông báo API. Tôi đã viết một lớp tùy chỉnh mở rộng UserNamePasswordValidator để chăm sóc chứng thực và IDispatchMessageInspector để kiểm tra mã thông báo.

Yêu cầu chỉ xuất hiện ở nơi chúng tôi muốn cung cấp một số kiểm tra tài khoản mà không cần người dùng được xác thực. Về mặt logic, các hoạt động này sẽ vẫn còn trong Dịch vụ tài khoản. Tuy nhiên hành vi dịch vụ được cấu hình để yêu cầu tên người dùng, mật khẩu và có một IServiceBehavior mà thêm một IDispatchMessageInspector kiểm tra tất cả các massage cho một mã thông báo.

Tôi đã được rà soát tất cả các điểm mở rộng khác nhau qua Extending Dispatchers - MicrosoftWCF Extensibility - Carlos Figueira

tôi có thể dường như để tìm một cách để chỉ áp dụng bảo mật ở mức độ hoạt động. Hoặc một cách để định cấu hình dịch vụ để các chức năng nhất định yêu cầu bảo mật/mã thông báo và các chức năng khác không yêu cầu.

Tôi mới tham gia WCF để có thể đơn giản nhưng tôi không tìm thấy. Nếu bạn biết một bài viết cho thấy cách bảo mật các phần khác nhau của một dịch vụ theo những cách khác nhau hoặc nếu bạn biết cách, vui lòng cung cấp cho tôi một số thông tin. Cảm ơn bạn.

+0

Đối với điều này, bạn có thể tạo điểm cuối riêng biệt ('miễn phí'/dịch vụ công cộng) mà không cần bảo mật hoặc với các cài đặt bảo mật khác nhau – SalientBrain

+0

Làm cách nào để giới hạn hoạt động ở điểm cuối đó? Nếu không có xác thực, tôi muốn giới hạn những gì có thể được gọi. – Allan

+0

Bạn phơi bày điểm cuối với giao diện đặc biệt, khác với điểm chính (chỉ các hoạt động bị hạn chế) – SalientBrain

Trả lời

1

Khi bạn muốn cho phép/từ chối quyền ở cấp độ hoạt động, bạn có thể đặt các phương thức của mình với thuộc tính PrincipalPermission.

Bạn có thể sử dụng như thế này:

[PrincipalPermission(SecurityAction.Demand,Authenticated=false)] 
void NotAutenticationRequiredMethod() 
[PrincipalPermission(SecurityAction.Demand,Authenticated=true)] 
void AuthenticationRequiredMethod() 

Như bạn muốn một cái gì đó nhiều hơn “linh hoạt”, bạn cũng có thể sử dụng vai trò, vì vậy không biên dịch lại sẽ là cần thiết:

[PrincipalPermission(SecurityAction.Demand, Role = "CustomRole")] 

Bạn có thể đọc thêm tại đây: https://msdn.microsoft.com/en-us/library/ff649821.aspx

Ở cấp phương thức, bạn cũng có thể kiểm tra bạn OperationContext.Current.ServiceSecurityContext đối tượng để xác minh xem yêu cầu nếu từ người dùng đã được xác thực và đưa ra quyết định nào đó.

Hãy nhớ rằng SecurityContext có thể xác thực khác nhau:

string primaryIdentity = OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name; 

string windowsIdentity = OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name; 

đọc thêm ở đây: https://sankarsan.wordpress.com/2010/07/25/identity-securitycallcontext-in-wcf/

Hy vọng nó giúp.

+0

Cảm ơn bạn. Vai trò giải quyết một phần vấn đề của tôi. Điều gì về các thẻ? 2 hoạt động khác nhau yêu cầu mã thông báo khác nhau hoạt động. Ngay bây giờ tôi đang sử dụng một IMessageInspector nhưng nó kiểm tra tất cả các tin nhắn, làm thế nào có thể imspect tin nhắn ở cấp độ hoạt động? – Allan

+0

Dữ liệu xác thực, bao gồm mã thông báo bạn truy cập với đối tượng OperationContext. Bạn có truyền mã thông báo trong MessageHeader không? Nếu vậy, bạn có thể đọc mã thông báo ở cấp độ hoạt động trong tiêu đề bằng cách sử dụng OperationContext.Current.IncomingMessageHeaders. –

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