Filter trong ASP.Net MVC
I. Bốn kiểu filter cơ bản trong ASP.Net MVC MVC hỗ chúng ta bốn kiểu filter cơ bản. Mỗi cái sẽ có logic tại những thời điểm khác nhau trong quá trình xử lý yêu cầu Authorization IAuthorizationFilter AuthorizeAttribute Chạy trước hết, trước khi bất kì những filter khác hoặc phương thức ...
I. Bốn kiểu filter cơ bản trong ASP.Net MVC
MVC hỗ chúng ta bốn kiểu filter cơ bản. Mỗi cái sẽ có logic tại những thời điểm khác nhau trong quá trình xử lý yêu cầu
Authorization | IAuthorizationFilter | AuthorizeAttribute | Chạy trước hết, trước khi bất kì những filter khác hoặc phương thức action |
Action | IActionFilter | ActionFilterAttribute | Chạy trước và sau phương thức action |
Result | IResultFilter | ActionFilterAttribute | Chạy trước và sau action result thực thi |
Exception | IExceptionFilter | HandleErrorAttribute | Chỉ chạy nếu filter khác, phương thức action hoặc action result bung lỗi |
Trước khi MVC framework triệu gọi action, nó xem xét sự định nghĩa của phương thức có những thuộc tính trong bảng trên được thực thi hay không. Nếu có, khi đó tại những thời điểm thích hợp của quá trình request, những phương thức được định nghĩa bởi những interface được triệu gọi. Framework bao gồm những lớp thực thi những interface có tính chất đễ lọc
II. Áp dụng việc lọc cho controller và action
Bộ lọc có thể áp dụng cho từng action riêng biệt hay cho toàn bộ controller. Ví dụ sau chúng ta áp dụng lọc Authorize cho từng action
namespace SportsStore.WebUI.Controllers { public class AdminController : Controller { [Authorize] public ViewResult Index() { if (!Request.IsAuthenticated) { FormsAuthentication.RedirectToLoginPage(); } } [Authorize] public ViewResult Create() { if (!Request.IsAuthenticated) { FormsAuthentication.RedirectToLoginPage(); } } } }
Chúng ta có thể áp dụng nhiều filter trên cùng một action. Ngoài ra, chúng ta cũng có thể trộn lẫn giữa việc lọc ở nhiều cấp độ từ cấp độ lớp đến cấp độ phương thức action như ví dụ sau:
[Authorize(Roles="trader")] // applies to all actions public class ExampleController : Controller { [ShowMessage] [OutputCache(Duration=60)] public ActionResult Index() { } }
III. Sử dụng lọc Authorization
Lọc Authorization là những bộc lọc chạy trước hết tất cả các bộ lọc khác và trước khi phương thức action được triệu gọi. Như cái tên của nó, những bộ lọc này sẽ ép chính sách chứng thực, bảo đảm rằng những phương thức action được gọi bởi những người dùng được cho phép. Bộ lọc Authorization thực thi AuthorizationFilter interface
namespace System.Web.Mvc { public interface IAuthorizationFilter { void OnAuthorization(AuthorizationContext filterContext); } }
MVC Framwork nhận yêu cầu từ trình duyệt. Hệ thống route xử lý url được yêu cầu và chiết tên của controller và action được nhắm tới. Một thể hiện của lớp controller được tạo ra nhưng trước khi phương thức action được gọi, MVC framework kiểm tra nếu có bất kì bộ lọc authorization được sử dụng cho phương thức action. Nếu có, phương thức OnAuthorization của interface IAuthorizationFilter sẽ được gọi. Nếu mà bộ lọc authentication xác nhận anh này ok, những xử lý kể tiếp của quá trình xử lý sẽ diễn ra. Ngược lại thì request sẽ bị từ chối
1. Sử dụng bộ lọc Authorization có sẵn
MVC framework bao gồm bộ lọc authorization được gọi là AuthorizeAttribute. Chúng ta có thể chỉ định chính sách chứng authorization sử dụng hai thuộc tính public như ví dụ sau:
Users | String | Danh sách những cái tên được phép truy xuất vào phương thức action. Các username cách nhau bởi dấu phẩy |
Roles | String | Danh sách những tên role. Các tên role cách nhau bởi dấu phẩy. Nếu user muốn truy xuất vào được những phương thức action, thì role của user phải nằm trong danh sách này |
Ví dụ:
[Authorize(Users="adam, steve, bob", Roles="admin")] public ActionResult Index() { return View(); }
Chúng ta đã chỉ định những người nào và những vai trò nào trong danh sách. Điều này có nghĩa là việc cho phép trừ khi cả hai điều kiện là tên người dùng là adam, steve hoặc bob và những user này phải có vai trò là admin. Ngoài những điều trên, request cũng đã phải được chứng thực. Nếu chúng ta không chỉ định bất kì user hoặc role, khi đó bất kì những user nào được chứng thực cũng sẽ dùng được phương thức action
Cho hầu hết các ứng dụng, chính sách authorization mà AuthorizeAttribute cung cấp là quá đủ cho chúng ta. Nếu chúng ta muốn thực thi một cái gì đó đặc biệt, chúng ta có thể thừa kế lại lớp này. Điều này ít nguy hiểm hơn việc thực thi IAuthorizationFilter interface một cách trực tiếp nhưng chúng ta cần cẩn thận việc ảnh hưởng của chính sách và kiểm tra nó một cách triệt để
Lớp AuthorizeAttribute cung cấp cho chúng ta 2 điểm để custom:
– Phương thức AuthorizeCore được gọi từ AuthorizeAttribute thực thi kiểm tra cấp phép
– Phương thức HandleUnauthorizedRequest, được gọi khi sự cấp phép kiểm tra thất bại
2. Custom chính sách Authorization
Để mô tả việc custom chính sách authentication, chúng ta sẽ tạo ra một lớp thừa kế lớp AuthorizeAttribute. Chính sách này sẽ gán quyền truy cập đến bất kì ai truy cập website từ trình duyệt chạy trực tiếp từ server (local host) cũng như
những username và role khớp với những quy tắc thông thường của AuthorizeAttribute. Điều này có ích cho phép các admin vượt qua tiến trình đăng nhập. Ví dụ như sau:
using System.Web; using System.Web.Mvc; namespace MvcFilters.Infrastructure.Filters { public class OrAuthorizationAttribute : AuthorizeAttribute { protected override bool AuthorizeCore(HttpContextBase httpContext) { return httpContext.Request.IsLocal || base.AuthorizeCore(httpContext); } } }
Và chúng ta sử dụng bộ lọc đó như sau:
[OrAuthorization(Users = "adam, steve, bob", Roles = "admin")] public ActionResult Index() { return View(); }
Bây giờ local user không cần có trong danh sách chỉ định cũng như được gán vai trò admin nhưng vẫn truy xuất được phương thức action