zoukankan      html  css  js  c++  java
  • MVC3中使用AuthorizeAttribute特性来完成登陆权限的验证

    过去的过去,往往对于一种问题有一个很直观的解决方法,如,判断用户是否登陆,判断用户session是否为空,一般会这个写在页面中:

    if(HttpContext.Session.IsNewSession)
    {
      // go to Logon
    }

    每个需要验证的页面都要这样去写同样的代码,这样的程序是我们不提供的,因为它重复了自己。

    当.net出现Attribute之后,MVC出现了之后,改变了这一切,如果希望判断这个页面的访问理否需要登陆或者其它权限,只需要写类似这样的代码即可:

           [UserAuthentication(UserToUrlEnum = UserToUrlEnum.Login)]
            public ActionResult RegisterRedirect()
            {
                // code
            }

    而一般来说,我们的UserAuthentication这个类,我们下文称为过滤器,一般是这样来定义的:

    namespace _20110711MVC3的学习.Filter
    {
        /// <summary>
        /// 验证类型列举
        /// </summary>
        public enum UserToUrlEnum
        {
            /// <summary>
            /// 登录
            /// </summary>
            Login,
            /// <summary>
            /// 注册
            /// </summary>
            Register,
            /// <summary>
            /// 认证
            /// </summary>
            Certificate,
        }
     
        /// <summary>
        /// 用户验证过滤器
        /// </summary>
        public class UserAuthentication : AuthorizeAttribute
        {
            const string DOMAIN = "http://www.test.com";
            public UserToUrlEnum UserToUrlEnum { get; set; }
            /// <summary>
            /// 构造函数
            /// </summary>
            public UserAuthentication()
            {
                this.UserToUrlEnum = UserToUrlEnum.Login;
            }
            /// <summary>
            /// 执行前验证
            /// </summary>
            public override void OnAuthorization(AuthorizationContext filterContext)
            {
                if (filterContext.HttpContext.Session.IsNewSession && !ClientHelper.Current.HasUser)
                {
                    switch (this.UserToUrlEnum)
                    {
                        case UserToUrlEnum.Login:
                            {

    VCommons.Http.CookieHelper.Write("return_page",

    HttpContext.Current.Request.Url.ToString());

                                HttpContext.Current.Response.Redirect(DOMAIN +
                                "/Register/Login", true);
                            }
                            break;
                        case UserToUrlEnum.Register:
                            {

    filterContext.HttpContext.Response.Redirect(DOMAIN +

    "/Register/Register", true);

                            }
                            break;
                    }
                }
                else if (this.UserToUrlEnum == UserToUrlEnum.Certificate)
                {
                    filterContext.HttpContext.Response.Redirect(DOMAIN + "/Register/Certificate");
                }
     
            }
     
        }
    }

    小知识:attribute可以加在类的上面,也可以加在方法的上面,根据实际情况而定。

  • 相关阅读:
    Android微信九宫格图片展示控件
    ImageView设置rounded corner
    Android TitleBar推荐
    《Windows核心编程》目录索引
    《Windows内核分析》专题-索引目录
    wchar,char,string,wstring互转
    键盘过滤
    串口过滤
    Vmware中Linux 虚拟机与Windows物理机建立共享文件夹
    遍历某一进程模块
  • 原文地址:https://www.cnblogs.com/lori/p/2176356.html
Copyright © 2011-2022 走看看