2011-01-04 31 views
11

Tôi biết có thể trang trí bộ điều khiển với thuộc tính Ủy quyền để kiểm soát quyền truy cập, những gì tôi không biết là cách được chấp nhận hoặc thích hợp để thực thi bảo mật trên tất cả các bộ điều khiển/lượt xem một khu vực.Bảo mật mức khu vực cho asp.net mvc

Có điều gì trong web.config, đăng ký khu vực hoặc một số nơi khác để áp dụng bảo mật ủy quyền không?

Trả lời

9

Một cách thuận tiện là để tạo ra một lớp cơ sở mới

[Authorize] 
public abstract class AuthorizeBaseController : Controller 
{ 
} 

và chắc chắn rằng tất cả các bộ điều khiển của bạn mà bạn yêu cầu ủy quyền (trong trường hợp của bạn, tất cả mọi thứ trong khu vực mà bạn quan tâm) xuống từ AuthorizeBaseController.

public class HomeController : AuthorizeBaseController 
{ 
    public ActionResult Index() 
    { 
    return View(); 
    } 
} 

Thuộc tính [Authorize] sẽ ảnh hưởng đến tất cả các hậu duệ của lớp cơ sở mới.

Sửa Vấn đề mà tôi có với sử dụng phương pháp <location path="" > là, kể từ khi động cơ định tuyến làm cho nó có thể cho bất kỳ tuyến đường để gọi bất kỳ điều khiển, thiết lập ủy quyền dựa trên url (và do đó một lộ trình cụ thể) thay vì các hành động điều khiển làm cho nó có thể gọi một bộ điều khiển cần được bảo vệ và bỏ qua ủy quyền. Đó không phải là một vấn đề trong biểu mẫu web vì một trang là một trang (và không phải là một cuộc gọi phương thức), nhưng sự tách biệt giữa trang/đường dẫn và mã trong MVC làm cho lỗ hổng bảo mật này trở thành một lỗ hổng lớn.

+3

Phương pháp của bạn được đề xuất làm phương pháp cũ cho MVC2. Không phải ở tất cả cho thấy bạn là không chính xác. Đây là một liên kết đến kỹ thuật mới và cải tiến cho MVC3 bằng cách sử dụng bộ lọc toàn cầu http://blogs.msdn.com/b/rickandy/archive/2011/05/02/securing-your-asp-net-mvc-3-application .aspx –

+0

@Doug thật khéo léo. Cảm ơn! –

+0

Chào mừng bạn, và đó là một lời khen, vì tôi chỉ bắt đầu cố gắng học MVC3 vào thứ Ba. :) –

-3

bạn luôn có thể sử dụng <location path="" > <system.web> <authorization> deny or allow </authorization> </system.web> </location>

+1

Không sử dụng các phương pháp web.config để bảo mật các ứng dụng MVC, xem http://blogs.msdn.com/b/rickandy/archive/2012/03/23/securing-your-asp-net-mvc-4- app-and-the-new-allowanonymous-attribute.aspx –

+1

Bỏ phiếu xuống do các câu trả lời khác cho biết bạn không nên làm điều này ... và tại sao bạn không nên làm điều này. – JTech

0

Như đã được đề xuất, bạn có thể sử dụng phần tử <location /> trong web.config của mình. Nếu không, bạn có thể sử dụng một lớp điều khiển cơ sở cho mỗi khu vực và trang trí với AuthorizeAttribute để tất cả các bộ điều khiển kế thừa từ nó cũng được lọc.

7

chỉ cách an toàn để thực hiện việc này trong ứng dụng MVC là thực hiện những gì David gợi ý - phân bổ bộ điều khiển cơ sở và có tất cả bộ điều khiển trong phân lớp của bộ điều khiển cơ sở.

Sử dụng một vị trí < > thẻ để ủy quyền trong MVC sẽ lỗ hổng bảo mật mở trong ứng dụng của bạn. Bạn không quan tâm đến việc bảo mật URL hoặc tuyến đường. Bạn muốn tự bảo vệ các bộ điều khiển vì chúng là các tài nguyên thực tế mà bạn đang cố gắng bảo vệ. Vì vậy, sự bảo vệ cần được đặt trực tiếp trên bộ điều khiển.

Ngoài ra, hãy nhớ rằng một khu vực thực sự chỉ là một cách ưa thích để nhóm các tuyến chứ không phải bộ điều khiển. Cố gắng sử dụng logic ưa thích để phát hiện khu vực hiện tại và suy ra cài đặt ủy quyền cũng sẽ mở lỗ hổng bảo mật trong ứng dụng của bạn.

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