ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-01-26 22:04:32  阅读:163  来源: 互联网

标签:filterContext Asp string 验证 身份验证 Content 拦截器 public BaseController


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

 

标签:filterContext,Asp,string,验证,身份验证,Content,拦截器,public,BaseController
来源: https://www.cnblogs.com/wfy680/p/15848233.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有