網站的權限管理是一個很重要的功能,MVC中怎么實現對於網站的權限管理呢。
在MVC中有一個名為AuthorizeAttribute的類,我們可以創建我們自己的特性MemberValidationAttribute類,然后繼承AuthorizeAttribute類來實現我們自己的網站權限的管理。然后通過將MemberValidation特性添加到具體的Action上,將我們的權限管理精確到某個頁面上。
下面我通過一個例子了解一下。
首先我們創建一個空的MVC項目。創建兩個Controller和三個頁面。
主頁Controller
public class HomeController : Controller { // // GET: /Home/ public ActionResult Index() { return View(); } }
頁面
用戶登錄Controller,在Login Action下添加 Cookie寫入代碼。
public class MemberController : Controller { // // GET: /Member/ public ActionResult Index() { return View(); } public ActionResult Login() { var cookie = new HttpCookie("Login", "Success"); System.Web.HttpContext.Current.Response.SetCookie(cookie); return View("LoginSuccess"); } }
頁面
以上三個截圖的關系是,我們希望用戶先是通過登錄頁面登錄,提示成功后,在進入Home頁面。但是這時我們通過在地址欄內輸入"/Home"也可以登錄到主頁面,那也許就會報錯。在我做的上個項目中,就是需要對用戶的批量下單做一個驗證,如果有沒通過驗證的訂單是不讓用戶通過在地址欄輸入地址跳轉到訂單結算頁面的,不然是會報錯的。這里就需要我們將針對某一頁面的驗證添加到相應的Action上去。
下面我們添加一個名為MemberValidationAttribute類,讓他繼承AuthorizeAttribute類,這里我們只需要實現他的OnAuthorization方法
public class MemberValidationAttribute:AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { //獲取Cookies中的Login var memberValidation = System.Web.HttpContext.Current.Request.Cookies.Get("Login"); //如果memberValidation為null 或者 memberValidation不等於Success if (memberValidation==null||memberValidation.Value != "Success") { //頁面跳轉到 登錄頁面 filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new {controller="Member",action="Index" })); return; } //通過驗證 return; } }
然后將特性添加到HomeController下的Index Action上。
public class HomeController : Controller { [MemberValidation] public ActionResult Index() { return View(); } }
這下再怎么通過Url去跳轉的話也不能再不通過登錄的情況下進入我們的Home Index 頁面了。
有兩個遺留問題要在這里說一下:
第一:登錄成功的頁面並沒有添加一個跳轉到Home Index的 按鈕,所以登錄成功后還是要通過Url 到Home Index去。
第二:用戶登錄的時候將Cookie Login 清空。
2013-5-22 遺留問題一
在AuthorizeAttribute中還有一個方法叫AuthorizeCore,他返回一個bool值表示是否通過驗證。通過驗證的話跳轉到下一頁面A,如果未通過驗證,則跳轉到登錄頁面。
protected override bool AuthorizeCore(HttpContextBase httpContext) { var cook = System.Web.HttpContext.Current.Request.Cookies.Get("CustomerInfo"); if (cook != null) { if (cook.ToString() != "") { return true; } } return false; }
登錄頁面的設置在web.config中。如下:
<system.web> <authentication mode="Forms"> <forms loginUrl="~/Account/LoginPage" timeout="2880" /> </authentication> </system.web>
loginUrl就是要跳轉到的登錄頁面,這是在url地址欄會攜帶A的地址,作為登錄成功后的跳轉。
public ActionResult LoginPage(string ReturnUrl) { if (ReturnUrl != null) ViewBag.ReturnUrl = ReturnUrl; return View(); }