日常開發的絕大多數系統中,都涉及到管理用戶的登錄和授權問題。登錄功能(Authentication),針對於所有用戶都開放;而授權(Authorization),則對於某種用戶角色才開放。 在asp.net mvc中,微軟雖然已經幫助開發者構建了ASP.NET Identity這樣強大的驗證授權框架 ...
日常開發的絕大多數系統中,都涉及到管理用戶的登錄和授權問題。登錄功能(Authentication),針對於所有用戶都開放;而授權(Authorization),則對於某種用戶角色才開放。
在asp.net mvc中,微軟雖然已經幫助開發者構建了ASP.NET Identity這樣強大的驗證授權框架,但是如果想定製更多的邏輯功能的話,還得自己動動手。
根據日常的開發經驗,我總結了下麵1種方法:
1 學習了很多人的代碼後,發現在Controller里有一個OnActionExecuting方法,此方法是在Action之前執行的,非常方便。
派生類如下:
public class AuthenticationControllor : Controller { protected override void OnActionExecuting(ActionExecutingContext filterContext) { if (filterContext.HttpContext.Session["username"] == null) filterContext.Result = new RedirectToRouteResult("Login", new RouteValueDictionary { { "from", Request.Url.ToString() } }); base.OnActionExecuting(filterContext); } }
使用類如下:
// 不需要多寫任何邏輯代碼就能判斷是否登錄並跳轉 public class HomeController : AuthenticationControllor { public ActionResult Index() { return View(); } }
2. 繼承ActionFilterAttribute:
由於繼承Controller方法不太適合一個Controller下的有些Action需要登錄有些Action不需要登錄的場景,所以針對每個Action寫一個統一的特性會更好一些。
ActionFilterAttribute里也有OnActionExecuting方法,跟Controller一樣, 同是抽象實現了IActionFilter介面。
派生類如下:
// 登錄認證特性 public class AuthenticationAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { if (filterContext.HttpContext.Session["username"] == null) filterContext.Result = new RedirectToRouteResult("Login", new RouteValueDictionary { { "from", Request.Url.ToString() } }); base.OnActionExecuting(filterContext); } }
使用方法如下:
public class HomeController : Controller { [Authentication] public ActionResult Index() { return View(); } }
如果你想針對整個MVC項目的所有Action都使用此過濾器,步驟如下:
a. 確保Global.asax.cs的Application_Start方法中包含如下紅色行:
public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); } }
b. 在FilterConfig.cs文件中註冊相應的特性過濾器:
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); filters.Add(new AuthenticationAttribute()); } }