MVC自訂AuthorizeAttribute實現許可權管理

來源:互聯網
上載者:User

標籤: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();        }

     

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.