zoukankan      html  css  js  c++  java
  • 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中几个操作就可以这样简单的完成了,关于代码在文章下面会提供下载。

    实例下载

  • 相关阅读:
    Coursera机器学习week11 单元测试
    关于 TypeReference 的解释
    getModifiers 方法解释。
    instanceof isInstance isAssignableFrom 比较
    elasticsearch 基础 语法总结
    kibana 启动 关闭 和进程查找
    MD5 SHA1 SHA256 SHA512 SHA1WithRSA 的区别
    spring boot 项目 热启动
    java zip 压缩文件
    Packet for query is too large (1660 > 1024). You can change this value on the server by setting the max_allowed_packet' variable.
  • 原文地址:https://www.cnblogs.com/a-dou/p/5758044.html
Copyright © 2011-2022 走看看