一般具有用戶模塊的系統都需要對用戶是否登錄進行驗證,如果用戶登錄了就可以繼續操作,否則退回用戶的登錄頁面
對於這樣的需求我們可以通過自定義一個獨立的方法來完成驗證的操作,但是這樣代碼的重復率就大大提高了
對於這樣的需求,有一個比較好的解決方案,通過自定義一個全局的過濾器來完成這個操作
這里我們需要實現AuthorizeAttribute特性來完成對用戶身份的驗證
首先給出自定義的類,通過這個類來實現對用戶身份的判斷,通過重寫HandleUnauthorizedRequest函數
來完成用戶驗證失敗的處理操作,在AuthorizeCore方法中判斷用戶是否已經登錄過網站
public class isAuthorizeAttribute : AuthorizeAttribute { protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { //根據需要添加 filterContext.HttpContext.Response.Redirect("/student/login/login?errorMSG=3"); } protected override bool AuthorizeCore(HttpContextBase httpContext) { //根據需要添加,將自動根據返回值判斷用戶是否通過驗證 //true:通過 //false:未通過 bool result = false; if (httpContext.Session["Username"] != null) result = true; return result; } }
為了便於后期修改,將注冊過濾器的操作提取出來並保存在App_Start目錄中,具體類的定義如下,此處的isAuthorizeAttribute是上面定義的過濾器類
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); //注意這里的isAuthorizeAttribute filters.Add(new isAuthorizeAttribute()); } }
至此,我們完成了需要的准備工作,然后在全局的Global.asax文件中注冊我們的過濾器類,由於我們已經將需要的操作包裝在了FilterConfig.RegisterGlobalFilters中,
所有這里只需要通過調用這個函數便能實現我們需要的注冊的功能,代碼示例如下
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); //添加自定義全局登錄過濾器 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); }
運行之前的注意事項
操作到這里我們完成了需要的所有工作,但是對於一個網站的運行機制來說,首頁以及用戶登錄的頁面、忘記密碼、注冊的頁面
都是不應該進行驗證的,所有我們需要對這個頁面進行相應的操作,使得順利通過驗證
這里我們可以使用[AllowAnonymous]這個特性來使得頁面順利運行
示例如下
[AllowAnonymous] public class HomeController : Controller { // GET: Home public ActionResult Index() { return View(); } }
對所有的不需要驗證的控制器進行設置特性后,我們便可以運行項目進行測試了,這里我們描述的是需要大量驗證用戶是否登錄的頁面,
如果遇到只有少數幾個頁面需要驗證的情況,那我們只需要向使用基本的過濾器一樣的方式來使用即可,將我們自定的過濾器特性加到
對應的控制器之上即可
過濾器的介紹可以參看http://www.cnblogs.com/ives/p/filter.html
留待后查,同時方便他人
2017.12.9 19:48