2009-08-22 22 views
10

Giả sử một nhà phát triển tốc độ cao được giao nhiệm vụ xây dựng một ứng dụng ngân hàng sẽ được nhiều người khác truy cập. Mỗi người sẽ muốn truy cập thông tin tài khoản của riêng mình nhưng không muốn người khác truy cập thông tin đó. Tôi muốn biết cách thực hành tốt nhất để hạn chế quyền truy cập trong ứng dụng MVC để chỉ người dùng sở hữu thông tin (hoặc quản trị viên) mới có thể truy cập nó.Cơ chế tốt nhất để thực hiện bảo mật dạng hạt (ví dụ: ủy quyền) trong ứng dụng ASP.NET MVC là gì?

Thuộc tính Authorize cho phép chúng tôi hạn chế theo vai trò. Mặc dù đây là điểm bắt đầu, dường như bất kỳ người dùng được xác thực nào đều có thể truy cập vào bất kỳ thông tin nào của người dùng khác.

ActionFilters dường như cung cấp tùy chọn kiểm soát chi tiết hơn một chút và có thể có thể được sử dụng để thực hiện tác vụ. Tuy nhiên, tôi không rõ liệu họ có phải là phương pháp được đề nghị hay không.

Bất kỳ hướng dẫn hoặc ý tưởng nào đều được hoan nghênh.

+9

"Nhà phát triển tốc độ cao" là gì? –

Trả lời

0

Tôi nghĩ rằng bạn có nó đúng, cách tiếp cận ActionFilter là một cách âm thanh.

Tôi muốn tạo bộ bộ lọc hành động tùy chỉnh được kế thừa từ AuthorizeAttribute.

Ngoài tính năng funnctionality của thuộc tính Ủy quyền, bạn có thể thực hiện chính sách nghiêm ngặt hơn cho chủ sở hữu một cách chính xác.

HTH,

Dan

+1

Cảm ơn bạn Dan! Đề xuất của bạn cho việc triển khai "chính sách chỉ chủ sở hữu nghiêm ngặt hơn" là gì? Đây có phải là một cái gì đó giống như những gì Mark đã mô tả ở trên? –

+0

Chính xác Anthony, đoạn cuối cùng nói riêng về câu trả lời của Mark. Tôi sẽ lấy được các bộ lọc tùy chỉnh của bạn từ bộ lọc Ủy quyền vì bạn sẽ cần một IPrincipal được ủy quyền để kiểm tra ACL. –

9

ActionFilter có lẽ là một điểm khởi đầu tốt, nhưng tùy thuộc vào kiến ​​trúc của bạn, bạn có thể muốn xem xét liệu chu vi phòng thủ là đủ tốt.

Nếu bạn đang xây dựng một ứng dụng ASP.NET MVC một lớp (và có thể có lý do hoàn toàn hợp lý để thực hiện điều này), ActionFilter sẽ cung cấp khả năng phòng thủ tốt, đồng thời rất đơn giản để áp dụng .

Mặt khác, nếu ứng dụng của bạn là một ứng dụng nhiều lớp, Defense in Depth thích hợp hơn. Trong trường hợp đó, bạn nên cân nhắc áp dụng logic ủy quyền trong Mô hình miền hoặc thậm chí trong lớp Truy cập dữ liệu. Điều này sẽ đảm bảo rằng nếu bạn phát triển một ứng dụng khác dựa trên cùng một Mô hình miền (ví dụ: dịch vụ web), logic ủy quyền vẫn sẽ được áp dụng.

Bất kể bạn làm gì, tôi thực sự khuyên bạn nên căn cứ vào việc triển khai ủy quyền thực tế trên IPrincipal. Trên một lưu ý cụ thể hơn, những gì bạn đang yêu cầu ở đây được mô hình hóa tốt nhất với ủy quyền dựa trên ACL: Đặt ACL trên mỗi hồ sơ người dùng theo mặc định chỉ cấp quyền truy cập cho người dùng và người quản trị. Nếu/khi bạn cần mở rộng ứng dụng để cho phép truy cập được ủy quyền vào hồ sơ của người dùng khác (tôi không biết liệu điều đó có thực tế từ xa trong trường hợp cụ thể của bạn không), bạn có thể làm điều đó bằng cách thêm một mục mới vào ACL.

Trong trường hợp này, việc đánh giá truy cập liên quan đến việc lấy ACL cho tài nguyên được yêu cầu và kiểm tra xem người dùng hiện tại (IPrincipal) có được bao gồm trong ACL đó hay không. Một hoạt động như vậy rất có khả năng liên quan đến các hoạt động ngoài quy trình (tìm kiếm ACL trong cơ sở dữ liệu), vì vậy nó có thể là một phần ẩn của một ứng dụng bằng cách ẩn nó đằng sau một ActionFilter giống như nó có khả năng ẩn một số vấn đề hiệu năng. Trong trường hợp này, tôi sẽ xem xét làm cho mô hình ủy quyền thêm một chút khám phá/hiển thị.

+1

Đánh dấu, đây là một chiến lược tuyệt vời! Cảm ơn! Trong hầu hết các dự án trước, chúng tôi đã viết các thành phần bảo mật của riêng mình để quản lý các perm, người dùng, nhóm, vai trò, vv và bỏ qua kiến ​​trúc thành viên ASP.NET đặc biệt để điều khiển truy cập ở các mức thấp hơn. Tôi đã HOPED rằng có một cách dễ dàng hơn để thực hiện quyền trong MVC hơn là của riêng tôi. Kể từ khi đăng bài đầu tiên của tôi, tôi đã kết thúc bằng văn bản nó anyway nhưng đã một cách tiếp cận lai. Tôi đã sử dụng thành viên của ASP.NET và các nhà cung cấp vai trò cho phép cơ bản và vai trò mgmt nhưng đã phát triển nhóm của riêng tôi và quản lý quyền để kiểm soát chi tiết hơn. –

+0

Khi người dùng cố gắng thực hiện một hành động (trên bộ điều khiển), tôi kiểm tra vai trò của anh ta để đảm bảo rằng anh ta có quyền truy cập "cơ bản". Nếu không, tôi chuyển hướng anh ta. Nếu anh ta có quyền truy cập cơ bản, tôi gọi hàm chi tiết hơn để kiểm tra các quyền thực tế của mình đối với loại đối tượng cụ thể và/hoặc cá thể anh ta đang cố truy cập. Ngay bây giờ, tôi chưa thực hiện điều này như một bộ lọc hành động nhưng tôi chỉ gọi nó trong mỗi hành động. Tôi sẽ tái cấu trúc nó ngay. –

+0

Vui mừng khi bạn có thể sử dụng câu trả lời - bạn cũng có thể muốn kiểm tra câu trả lời này có phần liên quan: http://stackoverflow.com/questions/1335315/access-control-in-asp-net-mvc-depending-on -input-parameters-service-layer/1336404 # 1336404 –

1

Theo quan điểm của tôi nếu bạn có ứng dụng lớp đơn thì ủy quyền là lựa chọn tốt nhất và cũng là bộ lọc hành động tốt hơn và đơn giản hơn để sử dụng. Nhưng nếu ứng dụng của bạn là đa lớp thì bạn sử dụng danh sách Kiểm soát truy cập USE [ACL].

0

Nếu bạn muốn ủy quyền bên ngoài, bạn có thể xem xét triển khai dựa trên XACML.