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

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

实例代码

作者:LyIng.Net

您可能感兴趣的文章:

  • Asp.net Core 3.1基于AspectCore实现AOP实现事务、缓存拦截器功能
  • asp.net mvc core管道及拦截器的理解
  • ASP.NET Core 3.0 gRPC拦截器的使用
  • ASP.NET 通过拦截器记录错误日志的示例代码

本文由 华域联盟 原创撰写:华域联盟 » Asp.net Mvc 身份验证、异常处理、权限验证(拦截器)实现代码

转载请保留出处和原文链接:https://www.cnhackhy.com/44261.htm

本文来自网络,不代表华域联盟立场,转载请注明出处。

作者: sterben

发表回复

联系我们

联系我们

2551209778

在线咨询: QQ交谈

邮箱: [email protected]

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部