博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【ASP.NET】ASP.NET中权限验证使用OnAuthorization实现
阅读量:6969 次
发布时间:2019-06-27

本文共 7640 字,大约阅读时间需要 25 分钟。

在项目开发中,通常我们都会涉及到用户登录才能访问的网页,比如购物网站,我们浏览商品,添加购物车(以前开发的时候在这里就需要登录用户,但是现在有了缓存的实现,这里可以将商品加入缓存,等到结账的时候再登录),选择结账的时候需要登录,那么这时候我们需要跳转到登录页面登录,登录之后还可以回到记录下来的原始的页面,那么这之后我们有好几种方法可以实现这种效果,下面笔者举例两种:

第一种:登录模块不管怎么样都是统一的,就是在每个需要登录的方法里面判断用户是否登录,如果没有登录,则跳转登录,这种的缺点是工作量大,代码冗余。

第二种:使用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;                        }                    }                    else if (acc.IsAccess == AccessEnum.Access)//需要其他权限                    {                        if (!IsAccess(context))                        {                            context.Result = Content("权限不够", "text/json");                            return;                        }                    }                }            }            base.OnAuthorization(context);        }        ///         /// 检查是否登录        ///         /// 
一个bool类型的数据,表示用户是否登录
public bool IsLogin() { String userName = (String)System.Web.HttpContext.Current.Session["UserName"]; String Password = (String)System.Web.HttpContext.Current.Session["Password"]; if (System.Web.HttpContext.Current.Session["UserName"] != null) { if ("abc".Equals(userName) && "123".Equals(Password)) { return true; } } else { if (System.Web.HttpContext.Current.Request.Cookies["settings"] == null) { return false; } //检查Cookies String cookie_UserName = System.Web.HttpContext.Current.Request.Cookies["settings"]["UserName"]; String cookie_Password = System.Web.HttpContext.Current.Request.Cookies["settings"]["Password"]; //检查用户名和密码 if (cookie_UserName == null || cookie_Password == null) { return false; } else { //在数据库中检查 if ("abc".Equals(cookie_UserName) && "123".Equals(cookie_Password)) { //把用户名和密码放到Session中 Session.Add("UserName", cookie_UserName); Session.Add("Password", cookie_Password); return true; } } } return false; } /// /// 权限检查 /// /// ///
一个bool的数据,表示用户是否拥有其他权限
public bool IsAccess(AuthorizationContext context) { bool isAccess = false; var controller = context.RouteData.Values.Keys.First(p => p == "controller"); var action = context.RouteData.Values.Keys.First(p => p == "action"); var url = "/" + context.RouteData.Values[controller] + "/" + context.RouteData.Values[action]; //根据controller和action 可以判断权限了 //isAccess = true; return isAccess; } }}
BaseController.cs

这里的BaseController类继承了Controller,并且重写了其中了OnAuthorization方法,在OnAuthorization方法中,首先解析出用户请求的Controller名称,然后判断是否需要验证这个Controller,案例中验证的是名为Manager的Controller,得到了对应的Controller后,接下来解析用户请求的具体是什么方法,再利用反射找出方法有什么特性,根据特性进行权限验证。

 

ManagerController.cs

namespace MvcApplication1.Controllers{    public class ManagerController : BaseController    {        [Access(IsAccess = AccessEnum.Login)]        public ActionResult Index()        {            return View("index");        }        [Access(IsAccess = AccessEnum.Anonymous)]        public ActionResult ToLogin(){            String user = Request["UserName"];            String password = Request["Password"];            if ("abc".Equals(user) && "123".Equals(password)) {              //放到session中                Session.Add("UserName", "abc");                Session.Add("Password", "123");                //放到Cookie中,可以进行加密处理                HttpCookie myCookie = new HttpCookie("settings");                myCookie["UserName"] = user;                myCookie["Password"] = password;                 System.Web.HttpContext.Current.Response.Cookies.Add(myCookie);                 HttpContext.Response.Redirect("~/Manager/Index");            }            return View("Error");        }        [Access(IsAccess = AccessEnum.Anonymous)]        public ActionResult Login()        {            return View();        }        [Access(IsAccess = AccessEnum.Login)]        public ActionResult LoginOff(){              //清除Session信息              Session.Clear();              //清除Cookie信息              HttpCookie myCookie = new HttpCookie("settings");              myCookie.Expires = DateTime.Now;              System.Web.HttpContext.Current.Response.Cookies.Add(myCookie);              HttpContext.Response.Redirect("~/Manager/index");        }    }}
ManagerController.cs

AccessAttribute.cs

namespace MvcApplication1.Models.Attribute{    ///     /// 
创建自定义权限认证特性
///
该特性应用的范围可以为类、构造方法、字段、方法、属性
///
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)] public class AccessAttribute : System.Attribute { public AccessEnum IsAccess { set; get; } } /// /// 权限认证级别 /// public enum AccessEnum { /// /// 权限认证 /// Access, /// /// 只需要登录 /// Login, /// /// 不需要登录 /// Anonymous }}
AccessAttribute.cs

Error.cshtml

@{    ViewBag.Title = "error";    Layout = "~/Views/Shared/_Layout.cshtml";}

账号密码错误

Error.cshtml

Index.cshtml

@{    ViewBag.Title = "Index";    Layout = "~/Views/Shared/_Layout.cshtml";}

登录成功,恭喜你登录成功

Index.cshtml

Login.cshtml

@{    ViewBag.Title = "登录";    Layout = "~/Views/Shared/_Layout.cshtml";}
Login.cshtml

 

转载地址:http://baisl.baihongyu.com/

你可能感兴趣的文章
《从零开始学Swift》学习笔记(Day43)——构造函数继承
查看>>
mysql dba系统学习(4)mysql的多实例multi启动停止
查看>>
TabHost 置于底部 顶部的方法
查看>>
【HTML5】一起学习canvas【一】
查看>>
2017年Linux运维人员必会开源运维工具体系
查看>>
Spring Struts2 Hessian集成的一个问题
查看>>
BFC的形成条件和特性分析
查看>>
关于内存泄漏的调试方法
查看>>
中文乱码
查看>>
如何学好C++语言
查看>>
2.4 运算符与表达式
查看>>
保存时提示没有root permission
查看>>
反转链表
查看>>
安卓中的事件分发机制之View控件
查看>>
application内置对象
查看>>
iphone5手机端内容超出iphone6没问题且超出内容为http://.....网址
查看>>
Oracle 11g OEM登录后提示“出现内部错误”
查看>>
十一种通用滤波算法(转)~~~非常有用!
查看>>
JMeter中的读取json数据---JSON Extractor插件
查看>>
编译原理作业
查看>>