• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

asp 搞代码 4年前 (2022-01-03) 32次浏览 已收录 0个评论

本问主要介绍asp.net的身份验证机制及asp.net MVC拦截器在项目中的运用。现在让我们来模拟一个简单的流程:用户登录》权限验证》异常处理

1、用户登录
验证用户是否登录成功步骤直接忽略,用户登录成功后怎么保存当前用户登录信息(session,cookie),本文介绍的是身份验证(其实就是基于cookie)的,下面看看代码。
引入命名空间
using System.Web.Security;

代码如下:
Users ModelUser = new Users() { ID = 10000, N来源[email protected]搞@^&代*@码网ame = UserName, UserName = UserName, PassWord = PassWord, Roles = “admin” };//用户实体
string UserData = SerializeHelper.Instance.JsonSerialize(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了。

代码如下:
///

/// 获取用户登录信息
///

///
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(Ticket.UserData);//反序列化
}
return null;
}

2、权限验证
这里用到的是MVC中的action拦截器(重写OnActionExecuting),在action执行之前会先运行拦截器中的代码。这里同时可以身份验证是否过期。

代码如下:
///

/// 权限验证
///

public class AuthAttribute : ActionFilterAttribute
{
///

/// 角色名称
///

public string Code { get; set; }
///

/// 验证权限(action执行前会先执行这里)
///

///
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//如果存在身份信息
if (!HttpContext.Current.User.Identity.IsAuthenticated)
{
ContentResult Content = new ContentResult();
Content.Content = string.Format(“”, FormsAuthentication.LoginUrl);
filterContext.Result = Content;
}
else
{
string[] Role = CheckLogin.Instance.GetUser().Roles.Split(‘,’);//获取所有角色
if (!Role.Contains(Code))//验证权限
{
//验证不通过
ContentResult Content = new ContentResult();
Content.Content = “”;
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是怎么工作的。

代码如下:
///

/// 错误日志(Controller发生异常时会执行这里)
///

public class ErrorAttribute : ActionFilterAttribute, IExceptionFilter
{
///

/// 异常
///

///
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 Mvc 身份验证、异常处理、权限验证(拦截器)实现代码的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Asp.net Mvc 身份验证、异常处理、权限验证(拦截器)实现代码

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址