2014-04-16 19 views
5

Tôi đã thực hiện rất nhiều nghiên cứu về cách tốt nhất để bảo đảm ứng dụng MVC 5 của mình.Xác thực MVC5: Ủy quyền thuộc tính trên mọi bộ điều khiển hoặc bộ điều khiển cơ sở

Chúng tôi có một Web.csproj với nhiều bộ điều khiển WebAPI và cũng là trang web MVC có hai khu vực - một dành cho Quản trị viên và sau đó là trang web công khai.

Sau khi đọc this article which states that the Base Controller is best way, tôi quyết định đi theo cách tiếp cận đó.

Tuy nhiên, cá nhân tôi không đồng ý với việc sử dụng bộ điều khiển cơ sở (see this stackoverflow answer vì một số lý do của tôi).

Vì vậy, với điều kiện tôi đang sử dụng MVC 5 (Nhận dạng ASP.Net và Xác thực OWIN) - bất kỳ ai cũng có thể làm sáng tỏ những ưu điểm và nhược điểm của mỗi cách tiếp cận?

+0

bài viết này không hiển thị cách sử dụng bộ lọc chung? Tôi tin rằng bộ điều khiển cơ sở đã được đề xuất cho MVC 1 và 2 .... – dima

+0

@dima Vâng, bạn nói đúng ... Tôi đã nhầm lẫn với câu sau ở cuối bài viết: "Hãy để tôi hoàn toàn rõ ràng về điều này Cách duy nhất được hỗ trợ để bảo vệ ứng dụng MVC của bạn là có một lớp cơ sở với một thuộc tính [Authorize], và sau đó để có từng loại bộ điều khiển kiểu cơ sở. Bất kỳ cách nào khác sẽ mở một lỗ hổng bảo mật. " Tuy nhiên, tôi nghĩ rằng đã được nói trong bối cảnh cố gắng để bảo đảm một ứng dụng MVC thông qua Route Constraints ... một nghiêm trọng 'no-no'. – JTech

+0

anh ta đúng theo một cách nào đó, chỉ có nghĩa là nói về bộ lọc toàn cầu .... Tôi không hiểu tại sao bạn không tận dụng lợi thế của các bộ lọc toàn cầu và làm cho toàn bộ trang web được an toàn và chỉ cho phép truy cập nặc danh Các hành động như Đăng nhập, Đăng ký vv – dima

Trả lời

19

Thực tiễn hiện nay ở MVC 5 là để áp dụng các AuthorizeAttribute như một bộ lọc toàn cầu, và mở ra Actions cá nhân/Bộ xử lý với AllowAnonymousAttribute

Vì vậy, trong App_Start \ FilterConfig.cs thêm những dòng sau đây:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     ... existing filters 

     // use the [AllowAnonymous] attribute to open up individual Actions/Controllers 
     filters.Add(new System.Web.Mvc.AuthorizeAttribute()); 
     filters.Add(new RequireHttpsAttribute()); 
    } 

lưu ý: cho biện pháp tốt tôi cũng đã thêm RequireHttpsAttribute như mọi yêu cầu chứng thực với ASP.Net nhận dạng mang cookie auth, đó là dễ bị tổn thương để Man In The Middle tấn công nếu được thực hiện qua HTTP thông thường.

0

tôi sẽ luôn luôn sử dụng một bộ điều khiển cơ sở, vì những lý do nhiều hơn chỉ là xác thực và ủy quyền ...

Để có được câu hỏi của bạn, những gì chúng ta đã kết thúc làm được cán Authorization tùy chỉnh riêng của chúng tôi Các thuộc tính với các quy tắc phức tạp mà tất cả kế thừa từ AuthorizeAttribute. Nó khá đơn giản, tất cả những gì bạn làm là kế thừa từ thuộc tính đã cho và sau đó ghi đè lên các phương thức OnAuthorization và AuthorizeCore.

Nói chung, tất cả các bộ điều khiển của chúng tôi không cho phép truy cập anon, dựa trên lớp baseController của chúng tôi. Từ đó nó trở nên phức tạp khi cần thiết. Nhưng nó luôn luôn có ý nghĩa để sử dụng một lớp cơ sở cho những thứ như thế này và xây dựng trên đó. Nếu bạn cần thay đổi hệ thống một cách nhanh chóng, hãy nhấn vào nó trong baseClass và đó là nó.

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