2009-07-29 53 views
5

Tôi thích thuộc tính ủy quyền ASP.Net MVC, tôi có thể mở rộng nó và xây dựng logic của riêng tôi và trang trí bộ điều khiển của tôi với nó. NHƯNG,Viết thuộc tính tùy chỉnh trong C# như thuộc tính ủy quyền ASP.Net MVC

Trong kiến ​​trúc của tôi, tôi có một lớp dịch vụ chung (C# Class Library). Người dùng cuối có thể truy cập ứng dụng của tôi thông qua trang web ASP.Net MVC hoặc thông qua lớp REST WCF Webservice được tiếp xúc của tôi. Ứng dụng MVC asp.net của tôi và lớp dịch vụ WCF REST cả hai lần lượt truy cập vào lớp dịch vụ chung của tôi.

Tôi muốn ủy quyền xảy ra trong lớp dịch vụ phổ biến này chứ không phải trong Bộ điều khiển ASP.Net MVC hoặc trong lớp Dịch vụ REST được tiếp xúc của tôi.

Tôi có thể tạo thuộc tính ủy quyền ASP.Net MVC như điều để trang trí các phương pháp của tôi trong thư viện lớp C# chung không? Thuộc tính này sẽ lấy các tham số và sẽ quyết định liệu người dùng hiện tại có quyền truy cập để thực hiện chức năng đó hay không?

Cảm ơn & Kính trọng, Ajay

Trả lời

5

Những gì bạn đang tìm kiếm có thể đạt được bằng thư viện AOP, như PostSharp (http://www.postsharp.org/). Nó phức tạp hơn việc sử dụng thuộc tính Authorize trong mvc, nhưng vẫn khá đơn giản.

+0

cảm ơn rất nhiều. postsharp đang tìm kiếm tốt. Tôi đang đào sâu vào nó ngay bây giờ. Hy vọng kiến ​​trúc của tôi sẽ có được sự tăng trưởng tốt. – Ajay

1

Không, AuthorizeAttribute làm việc vì khuôn khổ MVC gọi nó một cách rõ ràng trước khi gọi phương pháp này. Một tính năng tương tự cho lớp dịch vụ của bạn sẽ chỉ hoạt động nếu các máy khách của bạn cũng gọi nó một cách rõ ràng. Sẽ không hợp lý nếu cho rằng ngay cả một khách hàng có thiện chí cũng sẽ luôn nhớ tìm kiếm thuộc tính và gọi nó. WCF has its own security. Bạn nên sử dụng nó thay vì viết của riêng bạn.

+0

Nếu tôi đặt logic ủy quyền trong API REST của mình, thì tôi cũng sẽ phải sao chép nó trong bộ điều khiển. Đó là lý do tại sao tôi cần phải làm một cái gì đó mà là trong lớp dịch vụ (không WCF, chỉ cần thư viện lớp C#) – Ajay

+0

Bạn không cần phải lặp lại bất cứ điều gì. WCF và ASP.NET sẽ cho bạn biết * ai * được kết nối. Bạn chỉ cần dịch nó thành * cái gì * họ có thể làm. Mã này có thể được chia sẻ. Bạn không nên làm điều đó với một thuộc tính tùy chỉnh là tất cả những gì tôi đang nói. Sử dụng những gì đã được tích hợp sẵn trong các khung công tác. –

+0

Điều gì sẽ xảy ra nếu anh ấy quyết định thêm một giao diện người dùng khác? Anh sẽ phải viết tất cả những thuộc tính đó một lần nữa. Điều gì xảy ra nếu anh ta thay đổi một số quy tắc, như những nhóm nào được phép gọi một phương thức? Anh sẽ phải thay đổi tất cả các giao diện của mình. Có khả năng tạo ra một thuộc tính (với aop), và tôi tin rằng Ajay nên làm điều đó, bởi vì chỉ bằng cách đó, anh ta có thể đảm bảo rằng ủy quyền phù hợp với tất cả các giao diện người dùng và anh ta có thể thêm một lối vào khác một cách an toàn và không quan tâm đến tất cả các nội dung ủy quyền phổ biến cho tất cả giao diện người dùng ... – maciejkow

0

này không phải là quá khó để làm - có một vài nơi mà bạn có thể phản ánh ra các thuộc tính và xử lý nó cho phù hợp:

  • On bắt đầu ứng dụng trong Global.asx bạn có thể tùy chỉnh định tuyến và địa điểm cho lần xem

  • Đằng kiện yêu cầu ASP.Net vẫn bắn, vì vậy bạn có thể ghi đè lên một trong số họ

  • Tạo điều khiển cơ sở của riêng bạn và ghi đè OnActionExecuting


Cập nhật sau bình luận

Ahh, tôi thấy. Trong trường hợp đó nếu bạn đang thực hiện cuộc gọi trực tiếp thì bạn nên kiểm tra Code Access Security, mà tôi nghĩ rằng bao gồm những gì bạn có ý nghĩa.

Cách khác, thuộc tính tùy chỉnh có thể có ý nghĩa miễn là bạn đang sử dụng một số loại mẫu nhà máy - sau đó gọi phản ánh để nhà máy có thể kiểm tra các thuộc tính.

Nếu bạn không sử dụng phản chiếu để truy xuất lớp học hoặc gọi phương thức của mình (về cơ bản định tuyến nào trong MVC) thì bạn sẽ không có cơ hội kiểm tra thuộc tính của mình.

+1

trong ASP.Net MVC Tôi có thể làm điều này, tôi cần phải làm tương tự trong thư viện lớp C#, để bất kỳ ai đang gọi phương thức C#, nó sẽ làm kiểm tra ủy quyền. Cảm ơn. – Ajay

2

Một cách khác để xử lý việc này là sử dụng thuộc tính [PrincipalPermission] trong lớp dịch vụ của bạn. Điều này có thể ngăn người gọi thực hiện một phương thức (hoặc truy cập toàn bộ một lớp) mà không có sự cho phép đã định nghĩa.

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