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

posted @ 2011-09-14 16:16  张占岭  阅读(1834)  评论(1编辑  收藏  举报