在项目开发中,通常我们都会涉及到用户登录才能访问的网页,比如购物网站,我们浏览商品,添加购物车(以前开发的时候在这里就需要登录用户,但是现在有了缓存的实现,这里可以将商品加入缓存,等到结账的时候再登录),选择结账的时候需要登录,那么这时候我们需要跳转到登录页面登录,登录之后还可以回到记录下来的原始的页面,那么这之后我们有好几种方法可以实现这种效果,下面笔者举例两种:
第一种:登录模块不管怎么样都是统一的,就是在每个需要登录的方法里面判断用户是否登录,如果没有登录,则跳转登录,这种的缺点是工作量大,代码冗余。
第二种:使用MVC的特性,定义类继承IAuthorizationFilter,重写OnAuthorization方法即可实现。此方法工作量少,代码不冗余,如果需要登录我们只需要给Controller或者Action给上标签即可。
上面列举了权限认证的两种形式,在实际开发中使用OnAuthorization和特性相结合的情况比较多,在任何能够使用特性的判断中都可以按照下面的思路来实现,例如(登录判断,权限判断,请求判断,去除空格,读取返回路径)等等。
接下来是笔者使用OnAuthorization的一个案例:

BaseController.cs
namespace MvcApplication1.Controllers { public class BaseController : Controller { protected override void OnAuthorization(AuthorizationContext context) { //解析控制器的名称 string ControllerName = context.ActionDescriptor.ControllerDescriptor.ControllerName; if (ControllerName.ToLower() == "Manager".ToLower())//这里只对Manager的控制器进行权限验证 { var b = context.HttpContext.Request.Browser;//浏览器判断 ie8 居然是7.0 if (b.Browser == "IE" && float.Parse(b.Version) < 7) { context.Result = Content("ie浏览器就只支持ie8+", "text/json"); return; } //解析出对应的方法 var Method = context.Controller.GetType().GetMethods().Where(c => c.Name.ToLower() == context.ActionDescriptor.ActionName.ToLower()).FirstOrDefault(); if (Method == null) { context.Result = Content("权限不够", "text/json"); return; } //解析出方法上面对应的特性 AccessAttribute acc = Method.GetCustomAttributes(typeof(AccessAttribute), true).FirstOrDefault() as AccessAttribute; if (acc != null) { if (acc.IsAccess == AccessEnum.Login)//需要登录权限 { if (!IsLogin()) { context.HttpContext.Response.Redirect("~/Manager/Login");//如果没有登录,就跳转到登录页面 return;

本文介绍了在ASP.NET项目中实现权限验证的两种方法:一是每个需要登录的方法内判断并跳转,二是继承IAuthorizationFilter,通过OnAuthorization方法实现。重点讲述了使用OnAuthorization的案例,通过在BaseController中重写该方法,解析请求的Controller和Method,结合特性进行权限验证。
最低0.47元/天 解锁文章
708

被折叠的 条评论
为什么被折叠?



