• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Asp.net Mvc 身份验证、异常处理、权限验证(拦截器)实现代码
    POST TIME:2021-10-18 03:14
    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.JsonSerializeUsers>(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.JsonDeserializeUsers>(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中几个操作就可以这样简单的完成了,关于代码在文章下面会提供下载。

    实例代码

    作者:LyIng.Net
    您可能感兴趣的文章:
    • Asp.net Core 3.1基于AspectCore实现AOP实现事务、缓存拦截器功能
    • asp.net mvc core管道及拦截器的理解
    • ASP.NET Core 3.0 gRPC拦截器的使用
    • ASP.NET 通过拦截器记录错误日志的示例代码
    上一篇:asp.net中3种验证码示例(实现代码)(数字,数字字母混和,汉字)
    下一篇:根据身份证号码计算出生日期、年龄、性别(18位) 根据入职时间计算工龄
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信