• MVC自定义AuthorizeAttribute实现权限管理


      【转】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();
            }
    复制代码

         

  • 相关阅读:
    PAT 1037. 在霍格沃茨找零钱(20)
    PAT 1036. 跟奥巴马一起编程(15)
    Topcoder SRM633 DIV2 解题报告
    HDU 4565 So Easy! 矩阵快速幂 + 共轭数
    HDU 2256 Problem of Precision 矩阵快速幂 + 共轭数
    FZU 1683 纪念SlingShot 矩阵快速幂
    CodeForces 185A Plant 矩阵快速幂
    HDU 2604 Queuing 矩阵快速幂
    HDU 1575 Tr A 矩阵快速幂
    HDU 1757 A Simple Math Problem 矩阵快速幂
  • 原文地址:https://www.cnblogs.com/leon719/p/3884652.html
Copyright © 2020-2023  润新知