视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Asp.net Mvc 身份验证、异常处理、权限验证()实现代码
2020-11-27 22:42:21 责编:小采
文档


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

实例代码

作者:LyIng.Net

下载本文
显示全文
专题