Asp.net Mvc 身份验证、异常处理、权限验证(拦截器)

本问主要介绍asp.net的身份验证机制及asp.net MVC拦截器在项目中的运用。现在让我们来模拟一个简单的流程:用户登录》权限验证》异常处理。

1、用户登录
验证用户是否登录成功步骤直接忽略,用户登录成功后怎么保存当前用户登录信息(session,cookie),本文介绍的是身份验证(其实就是基于cookie)的,下面看看代码。

引入命名空间

using System.Web.Security;

复制代码

Users ModelUser = new Users() { ID = 10000, Name = UserName, UserName = UserName, 
PassWord = PassWord, Roles = "admin" };//用户实体
string UserData = SerializeHelper.Instance.JsonSerialize<Users>(ModelUser);//序列化用户实体

//保存身份信息,参数说明可以看提示

FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket(1, UserName, 
DateTime.Now, DateTime.Now.AddHours(12), false, UserData);
HttpCookie Cookie = new HttpCookie(FormsAuthentication.FormsCookieName, 
FormsAuthentication.Encrypt(Ticket));//加密身份信息,保存至Cookie
Response.Cookies.Add(Cookie);

复制代码
现在身份信息就保存到cookie中了,如果有场景需要用到当前用户的用户ID或者别的信息的时候该怎么办呢?

那么,我们重新在cookie中获取身份信息,然后解密,再反序列化成用户实体就OK了。

复制代码

   /// <summary>
    /// 获取用户登录信息
    /// </summary>
    /// <returns></returns>
    public Users GetUser()
    {
        if (HttpContext.Current.Request.IsAuthenticated)//是否通过身份验证
        {
            HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];//获取cookie
            FormsAuthenticationTicket Ticket = FormsAuthentication.Decrypt(authCookie.Value);//解密
            return SerializeHelper.Instance.JsonDeserialize<Users>(Ticket.UserData);//反序列化
        }
        return null;
    }

复制代码
2、权限验证
这里用到的是MVC中的action拦截器(重写OnActionExecuting),在action执行之前会先运行拦截器中的代码。这里同时可以身份验证是否过期。

复制代码

   /// <summary>
    /// 权限验证
    /// </summary>
    public class AuthAttribute : ActionFilterAttribute
    {
        /// <summary>
        /// 角色名称
        /// </summary>
        public string Code { get; set; }

        /// <summary>
        /// 验证权限(action执行前会先执行这里)
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //如果存在身份信息
            if (!HttpContext.Current.User.Identity.IsAuthenticated)
            {
                ContentResult Content = new ContentResult();
                Content.Content = string.Format("<script type='text/javascript'>alert('请先登录!');window.location.href='{0}';</script>", FormsAuthentication.LoginUrl);
                filterContext.Result = Content;
            }
            else
            { 
                string[] Role = CheckLogin.Instance.GetUser().Roles.Split(',');//获取所有角色
                if (!Role.Contains(Code))//验证权限
                {
                    //验证不通过
                    ContentResult Content = new ContentResult();
                    Content.Content = "<script type='text/javascript'>alert('权限验证不通过!');history.go(-1);</script>";
                    filterContext.Result = Content;
                }
            }
        }
    }

复制代码
那么在action中怎么去调用呢?这里贴出HomeController中的代码来看下。

复制代码

   public class HomeController : BaseController
    {
        [AuthAttribute(Code = "admin")]//验证通过(这个action只允许admin查看)
        public ActionResult Index()
        {
            Users ModelUser = CheckLogin.Instance.GetUser();
            return View(ModelUser);
        }

        [AuthAttribute(Code = "user")]//验证不通过
        public ActionResult Index2()
        {
            return View();
        }

        [AuthAttribute(Code = "admin")]//验证通过,发生异常
        public ActionResult Index3()
        {
            return View();
        }
    }

复制代码
这样就可以把权限控制到action了。

3、异常处理
上面HomeController并不是继承Controller,而是继承我们自己定义的一个BaseController,那么我们来看看BaseController中有写什么东西?

   [ErrorAttribute]
    public class BaseController : Controller
    {
        //所有Controller都继承BaseController,则都会进行异常捕获
    }

在这里BaseController只做了一件事情,就是增加了一个ErrorAttribute的错误拦截器,那么只要是在Controller中发生的异常都会在ErrorAttribute中进行处理,你可以记录到数据库等操作。那么我们看看ErrorAttribute是怎么工作的。

复制代码

   /// <summary>
    /// 错误日志(Controller发生异常时会执行这里)
    /// </summary>
    public class ErrorAttribute : ActionFilterAttribute, IExceptionFilter
    {
        /// <summary>
        /// 异常
        /// </summary>
        /// <param name="filterContext"></param>
        public void OnException(ExceptionContext filterContext)
        {
            //获取异常信息,入库保存
            Exception Error = filterContext.Exception;
            string Message = Error.Message;//错误信息
            string Url = HttpContext.Current.Request.RawUrl;//错误发生地址

            filterContext.ExceptionHandled = true;
            filterContext.Result = new RedirectResult("/Error/Show/");//跳转至错误提示页面
        }
    }

复制代码
在这里可以把异常捕获,然后跳转到友好的错误提示页面。在MVC中几个操作就可以这样简单的完成了。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值