標籤:style blog http color os io for art
【轉】MVC自訂AuthorizeAttribute實現許可權管理
原文載自:小飛的DD http://www.cnblogs.com/feiDD/articles/2844447.html
網站的許可權管理是一個很重要的功能,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(); }