Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 635|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-7-9 05:24:54 | 显示全部楼层 |阅读模式
    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...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-22 22:19 , Processed in 0.054270 second(s), 28 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表