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可以加在类的上面,也可以加在方法的上面,根据实际情况而定。

  • 相关阅读:
    CustomDrawableTextView
    Snippet: align a TextView around an image
    How to import library ?
    Gradle自定义你的BuildConfig
    使用adb shell dumpsys检测Android的Activity任务栈
    Activity intent经常使用的 FLAG
    使用 ContentProviderOperation 来提升性能
    幻方算法
    自己制作的粉碎机批处理程序
    Ubuntu 16.10 server 相关
  • 原文地址:https://www.cnblogs.com/lori/p/2176356.html
Copyright © 2011-2022 走看看