7

Tôi đang thêm ASP.NET MVC vào một ứng dụng WebForms hiện có. Trong thời gian này, tôi không quan tâm đến việc xác thực/đăng nhập, vì phần này được xử lý bởi mã hiện có (Xác thực biểu mẫu).Ủy quyền dựa trên giấy phép trong ASP.NET MVC3

Trong ứng dụng WebForms hiện có, chúng tôi có ủy quyền dựa trên giấy phép tùy chỉnh trên mỗi trang. Vì vậy, mỗi người dùng có một bộ quyền, liệt kê các trang mà anh ta được phép truy cập.
Bây giờ tôi cần phải quyết định làm thế nào tôi có thể sử dụng cùng một hệ thống cho phép để hạn chế quyền truy cập vào các bộ điều khiển và hành động MVC cụ thể.

Như tôi đã biết, đối với ASP.NET MVC có một tiêu chuẩn AuthorizeAttribute nơi tôi có thể chỉ định vai trò. Tôi cũng tìm thấy một số bài viết đề xuất chỉ định quyền thay vì vai trò - sau đó có thể làm điều gì đó như sau:

[CustomAuthorize(Roles = "View products, Edit products")] 

Bằng cách mở rộng AuthorizeAttribute, tôi cũng có thể xác định cách lưu trữ và quyền truy cập.

Giải pháp này có thể chấp nhận được đối với tôi (mặc dù thay đổi ngữ nghĩa của vai trò có mùi một chút).
Nhưng trước khi cam kết với nó, tôi muốn xem những tùy chọn khác có. Và đó là nơi tôi đang mắc kẹt - Tôi đã không tìm thấy một cái nhìn toàn diện về các cách tiếp cận khác nhau về ủy quyền trong ASP.NET MVC. Tôi cũng muốn biết tất cả các khái niệm bảo mật (như Xác thực Mẫu, Nhà cung cấp Thành viên, Thuộc tính Cấp phép, IPrincipal, v.v.) có liên quan với nhau như thế nào và chúng được sử dụng như thế nào.

+0

Điều này tương tự như những gì đã được thử tại đây: http://stackoverflow.com/questions/10338734/custom-security-scenario-in-asp-net-mvc/ – antijon

+0

@antijon theo như tôi hiểu, nó tương tự như triển khai một AuthorizeAttribute tùy chỉnh. Nhưng tôi muốn tìm hiểu chi tiết hơn về các lựa chọn khác và ưu và khuyết điểm của họ. –

Trả lời

7

Điều đầu tiên bạn phải hiểu là giống như Webforms, có một đường dẫn trong MVC. Mỗi yêu cầu đi qua một số phương pháp và có các điểm mở rộng dọc theo cách bạn có thể "nối vào" và thực hiện mọi việc.

Tất cả các AuthorizeAttribute không được đưa vào điểm mở rộng OnAuthorization, và quyết định có cho phép ai đó truy cập hay không dựa trên tiêu chí bạn đã cung cấp cho nó (tên người dùng, vai trò, v.v.).

Dưới đây là một ví dụ: http://geekswithblogs.net/brians/archive/2010/07/08/implementing-a-custom-asp.net-mvc-authorization-filter.aspx

Bạn có thể tạo thuộc tính cho phép tùy chỉnh của riêng bạn, và thực hiện chính xác những điều tương tự với các tiêu chí của riêng bạn. Bạn không cần phải tái mục đích tham số Vai trò, bạn có thể tạo tất cả thông số của riêng mình nếu muốn.

Đây là phương thức mà MVC thích. Một điều tốt đẹp khác là nếu bạn cũng làm cho nó trở thành một bộ lọc, thì bạn có thể thêm nó vào bộ lọc toàn cục và áp dụng nó cho mọi thứ nếu bạn muốn.

Về cơ bản, bạn có hai lựa chọn hợp lý khác. Thực hiện một trình xử lý trong global.asax trong Application_AuthenticateRequest (không được khuyến nghị) hoặc tạo một BaseController chung mà bạn ghi đè OnAuthorize (thuộc tính hook cùng một thứ, nhưng ở một nơi khác).

Rất nhiều người cố gắng thực hiện xác thực bằng Biến phiên và đó chỉ là điều tồi tệ nhất để thực hiện.

Vì chúng tôi không biết gì về hệ thống xác thực và cấp phép của bạn, tất cả những gì chúng tôi có thể làm là cung cấp lời khuyên chung.

+0

Cảm ơn bạn đã trả lời!Liên quan đến xác thực - nó chỉ là một tên người dùng/mật khẩu đăng nhập thông qua Forms Auth và sử dụng một lớp người dùng tùy chỉnh. Liên quan đến hệ thống cấp phép - cho mỗi trang chúng tôi có một "khóa mô-đun" được xác định và chúng tôi lưu trữ trong các quyền cơ sở dữ liệu cho mỗi người dùng để truy cập từng trang. Kiểm tra các quyền hiện đang được thực hiện trong 'BasePage: Trang'. Tôi không chắc đó có phải là thông tin bạn muốn biết không? –

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