博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET MVC中利用AuthorizeAttribute实现访问身份是否合法以及Cookie过期问题的处理...
阅读量:6583 次
发布时间:2019-06-24

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

话说来到上海已经快半年了,时光如白驹过隙,稍微不注意,时间就溜走了,倒是没有那么忙碌,闲暇之际来博客园还是比较多的,记得上次在逛博问的时候看到有同志在问MVC中Cookie过期后如何作相关处理,他在阐述那么多页面不可能都去一个个手动处理。其实MVC很牛逼的地方就是把Attribute利用的非常完美,接下来就来看下它是如何做到的吧!

第一步、我们要定义一个登录过滤标签-LoginFilterAttribute并且继承AuthorizeAttribute。来看下它内部是啥样子

1 // Summary: 2     //     Represents an attribute that is used to restrict access by callers to an 3     //     action method. 4     [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] 5     public class AuthorizeAttribute : FilterAttribute, IAuthorizationFilter 6     { 7         // Summary: 8         //     Initializes a new instance of the System.Web.Mvc.AuthorizeAttribute class. 9         public AuthorizeAttribute();10 11         // Summary:12         //     Gets or sets the user roles.13         //14         // Returns:15         //     The user roles.16         public string Roles { get; set; }17         //18         // Summary:19         //     Gets the unique identifier for this attribute.20         //21         // Returns:22         //     The unique identifier for this attribute.23         public override object TypeId { get; }24         //25         // Summary:26         //     Gets or sets the authorized users.27         //28         // Returns:29         //     The authorized users.30         public string Users { get; set; }31 32         // Summary:33         //     When overridden, provides an entry point for custom authorization checks.34         //35         // Parameters:36         //   httpContext:37         //     The HTTP context, which encapsulates all HTTP-specific information about38         //     an individual HTTP request.39         //40         // Returns:41         //     true if the user is authorized; otherwise, false.42         //43         // Exceptions:44         //   System.ArgumentNullException:45         //     The httpContext parameter is null.46         protected virtual bool AuthorizeCore(HttpContextBase httpContext);47         //48         // Summary:49         //     Processes HTTP requests that fail authorization.50         //51         // Parameters:52         //   filterContext:53         //     Encapsulates the information for using System.Web.Mvc.AuthorizeAttribute.54         //     The filterContext object contains the controller, HTTP context, request context,55         //     action result, and route data.56         protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext);57         //58         // Summary:59         //     Called when a process requests authorization.60         //61         // Parameters:62         //   filterContext:63         //     The filter context, which encapsulates information for using System.Web.Mvc.AuthorizeAttribute.64         //65         // Exceptions:66         //   System.ArgumentNullException:67         //     The filterContext parameter is null.68         public virtual void OnAuthorization(AuthorizationContext filterContext);69         //70         // Summary:71         //     Called when the caching module requests authorization.72         //73         // Parameters:74         //   httpContext:75         //     The HTTP context, which encapsulates all HTTP-specific information about76         //     an individual HTTP request.77         //78         // Returns:79         //     A reference to the validation status.80         //81         // Exceptions:82         //   System.ArgumentNullException:83         //     The httpContext parameter is null.84         protected virtual HttpValidationStatus OnCacheAuthorization(HttpContextBase httpContext);85     }

这里我们要重写OnAuthorization这个方法。

接下来就看下LoginFilterAttibute这个"儿子"是怎么完成"老子"交待的任务了。直接上code

1 public class LoginFilterAttribute:AuthorizeAttribute 2     { 3  4         private static string formsCookieName = FormsAuthentication.FormsCookieName; 5  6         public override void OnAuthorization(AuthorizationContext filterContext) 7         { 8            HttpCookie formsCookie = 9                 System.Web.CookieManager.GetCookie(formsCookieName);10             if (formsCookie == null)11             {12                 //页面Cookie过期后返回登录页面13                 RedirectToLoginPage(filterContext);14                 return;15             }16  17             bool autenticated = HttpContext.Current.User.Identity.IsAuthenticated;18 19             //一旦发现身份不合法就作相应的处理.20             if (!autenticated )21             {22                 //redirect to login23                 RedirectToLoginPage(filterContext);24                 return;25             }26             //if success add login data to context27         }28            private static void RedirectToLoginPage(AuthorizationContext filterContext)29         {30             if (filterContext.HttpContext.Request.IsAjaxRequest())31             {32                 filterContext.Result = new JsonResult() 33                 { 34                     Data = new {35                         status = "error",36                         message = "Unauthorized_Message"37                     },38                     JsonRequestBehavior= JsonRequestBehavior.AllowGet39                 };40                 return;41             }42 else43 {44          //返回登录页面的相关处理..........45 } }

第二步、新建一个基类Controller-BaseController并且继承Controller。

1     [LoginFilter]//此处就是我们上面定义的LoginFilterAttribute2     public abstract partial class BaseController : Controller3     {4         public BaseController(){ 5         6         }7       //........其他相关处理8     }

第三步、不是有很多页面吗?那我只要在对应的Controller去继承那个BaseController就实现了,在访问任何一个页面都会去作相应的过滤和处理。

1 Public Class LoginController:BaseController2 {3      Public ActionResult Index()4     {5       //........6        return  View();7     }8 }

以上纯属个人观点,如有雷同纯属巧合!谢谢阅读,如果对您有帮助,请点关注并推荐!

转载于:https://www.cnblogs.com/kejie/p/6015073.html

你可能感兴趣的文章
从JDK源码角度看Short
查看>>
五年 Web 开发者 star 的 github 整理说明
查看>>
Docker 部署 SpringBoot 项目整合 Redis 镜像做访问计数Demo
查看>>
中台之上(五):业务架构和中台的难点,都是需要反复锤炼出标准模型
查看>>
使用模板将Web服务的结果转换为标记语言
查看>>
inno setup 打包脚本学习
查看>>
php 并发控制中的独占锁
查看>>
React Native 0.20官方入门教程
查看>>
JSON for Modern C++ 3.6.0 发布
查看>>
Tomcat9.0部署iot.war(环境mysql8.0,centos7.2)
查看>>
我的友情链接
查看>>
监听在微信中打开页面时的自带返回按钮事件
查看>>
第一个php页面
查看>>
世界各国EMC认证大全
查看>>
最优化问题中黄金分割法的代码
查看>>
在JS中使用Ajax
查看>>
Jolt大奖获奖图书
查看>>
android中webview空间通过Img 标签显示sd卡中 的图片
查看>>
ubuntu 16.04 安装PhpMyAdmin
查看>>
安卓开启多个服务
查看>>