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

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

 // Summary:
     //     Represents an attribute that is used to restrict access by callers to an
     //     action method.
     [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
     public class AuthorizeAttribute : FilterAttribute, IAuthorizationFilter
     {
         // Summary:
         //     Initializes a new instance of the System.Web.Mvc.AuthorizeAttribute class.
         public AuthorizeAttribute();

         // Summary:
         //     Gets or sets the user roles.
         //
         // Returns:
         //     The user roles.
         public string Roles { get; set; }
         //
         // Summary:
         //     Gets the unique identifier for this attribute.
         //
         // Returns:
         //     The unique identifier for this attribute.
         public override object TypeId { get; }
         //
         // Summary:
         //     Gets or sets the authorized users.
         //
         // Returns:
         //     The authorized users.
         public string Users { get; set; }

         // Summary:
         //     When overridden, provides an entry point for custom authorization checks.
         //
         // Parameters:
         //   httpContext:
         //     The HTTP context, which encapsulates all HTTP-specific information about
         //     an individual HTTP request.
         //
         // Returns:
         //     true if the user is authorized; otherwise, false.
         //
         // Exceptions:
         //   System.ArgumentNullException:
         //     The httpContext parameter is null.
         protected virtual bool AuthorizeCore(HttpContextBase httpContext);
         //
         // Summary:
         //     Processes HTTP requests that fail authorization.
         //
         // Parameters:
         //   filterContext:
         //     Encapsulates the information for using System.Web.Mvc.AuthorizeAttribute.
         //     The filterContext object contains the controller, HTTP context, request context,
         //     action result, and route data.
         protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext);
         //
         // Summary:
         //     Called when a process requests authorization.
         //
         // Parameters:
         //   filterContext:
         //     The filter context, which encapsulates information for using System.Web.Mvc.AuthorizeAttribute.
         //
         // Exceptions:
         //   System.ArgumentNullException:
         //     The filterContext parameter is null.
         public virtual void OnAuthorization(AuthorizationContext filterContext);
         //
         // Summary:
         //     Called when the caching module requests authorization.
         //
         // Parameters:
         //   httpContext:
         //     The HTTP context, which encapsulates all HTTP-specific information about
         //     an individual HTTP request.
         //
         // Returns:
         //     A reference to the validation status.
         //
         // Exceptions:
         //   System.ArgumentNullException:
         //     The httpContext parameter is null.
         protected virtual HttpValidationStatus OnCacheAuthorization(HttpContextBase httpContext);
     }

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

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

 public class LoginFilterAttribute:AuthorizeAttribute
     {

         private static string formsCookieName = FormsAuthentication.FormsCookieName;

         public override void OnAuthorization(AuthorizationContext filterContext)
         {
            HttpCookie formsCookie =
                 System.Web.CookieManager.GetCookie(formsCookieName);
             if (formsCookie == null)
             {
                 //页面Cookie过期后返回登录页面
                 RedirectToLoginPage(filterContext);
                 return;
             }

             bool autenticated = HttpContext.Current.User.Identity.IsAuthenticated;

             //一旦发现身份不合法就作相应的处理.
             if (!autenticated )
             {
                 //redirect to login
                 RedirectToLoginPage(filterContext);
                 return;
             }
             //if success add login data to context
         }
            private static void RedirectToLoginPage(AuthorizationContext filterContext)
         {
             if (filterContext.HttpContext.Request.IsAjaxRequest())
             {
                 filterContext.Result = new JsonResult()
                 {
                     Data = new {
                         status = "error",
                         message = "Unauthorized_Message"
                     },
                     JsonRequestBehavior= JsonRequestBehavior.AllowGet
                 };
                 return;
             }
 else
 {
          //返回登录页面的相关处理..........
 }
}

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

     [LoginFilter]//此处就是我们上面定义的LoginFilterAttribute
     public abstract partial class BaseController : Controller
     {
         public BaseController(){ 

         }
       //........其他相关处理
     }

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

 Public Class LoginController:BaseController
 {
      Public ActionResult Index()
     {
       //........
        return  View();
     }
 }

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

ASP.NET MVC中利用AuthorizeAttribute实现访问身份是否合法以及Cookie过期问题的处理的更多相关文章

  1. Asp.net Mvc中利用ValidationAttribute实现xss过滤

    在网站开发中,需要注意的一个问题就是防范XSS攻击,Asp.net mvc中已经自动为我们提供了这个功能.用户提交数据时时,在生成Action参数的过程中asp.net会对用户提交的数据进行验证,一旦 ...

  2. 解决asp.net mvc中*.resx资源文件访问报错

    个人笔记 问题重现 在asp.net mvc中,使用资源文件会出现一个问题,例如: 紧接着我进入视图界面,输入下面代码: <a href="javascript:void(0);&qu ...

  3. Asp.Net MVC 中实现跨域访问

    在ASP.Net webapi中可以使用  Microsoft.AspNet.WebApi.Cors  来实现: public static class WebApiConfig { public s ...

  4. 在Asp.Net MVC 中如何用JS访问Web.Config中appSettings的值

    应用场景: 很多时候我们要在Web.Config中添加appSettings的键值对来标识一些全局的信息,比如:调用service的domain,跳转其他网站页面的url 等等: 那么此时就涉及到了一 ...

  5. 在ASP.NET MVC中利用Aspose.cells 将查询出的数据导出为excel,并在浏览器中下载。

    正题前的唠叨 本人是才出来工作不久的小白菜一颗,技术很一般,总是会有遇到一些很简单的问题却不知道怎么做,这些问题可能是之前解决过的.发现这个问题,想着提升一下自己的技术水平,将一些学的新的'好'东西记 ...

  6. 在Asp.Net MVC中利用快递100接口实现订阅物流轨迹功能

    前言 分享一篇关于在电商系统中同步物流轨迹到本地服务器的文章,当前方案使用了快递100做为数据来源接口,这个接口是收费的,不过提供的功能还是非常强大的,有专门的售后维护团队.也有免费的方案,类似于快递 ...

  7. ASP.NET MVC中使用ASP.NET AJAX异步访问WebService

    使用过ASP.NET AJAX的朋友都知道,怎么通过ASP.NET AJAX在客户端访问WebService,其实在ASP.NET MVC中使用ASP.NET AJAX异步访问WebService 也 ...

  8. 在ASP.NET MVC3 中利用Jsonp跨域访问

    在ASP.NET MVC3 中利用Jsonp跨域访问 在信息系统开发的时,根据相关业务逻辑难免会多系统之间互相登录.一般情况下我们需要在多系统之间使用多个用户名和密码.这样客户就需要在多个系统之间重复 ...

  9. 在 ASP.NET MVC 中充分利用 WebGrid (microsoft 官方示例)

    在 ASP.NET MVC 中充分利用 WebGrid https://msdn.microsoft.com/zh-cn/magazine/hh288075.aspx Stuart Leeks 下载代 ...

随机推荐

  1. 怎么把Windows主机上的目录共享到Ubuntu上

    使用Oracle VM VirtualBox在Windows主机上创建了一台Ubuntu虚拟机,怎么把宿主机上的目录共享到Ubuntu上,可使用以下方法: eg.把Windows主机上D盘里的test ...

  2. linux部署不同版本mysql

    测试环境部署过程中经常会遇到同一个服务器上部署两个不同版本的mysql数据库,在部署过程中也会有各种各样的问题,现将部署多版本mysql的方法总结如下: 1.下载mysql版本 http://down ...

  3. intro.js 页面引导简单用法

    下载地址:http://pan.baidu.com/share/link?shareid=1894002026&uk=1829018343 <!DOCTYPE HTML PUBLIC & ...

  4. IIS无法启动,应用程序池自动关闭,应用程序池XXXX将被自动禁用 解决方案之一

    最近,新任职的公司有一台测试服务(Windows Server 2008 R2 + IIS6.1)器因突然停电,造成了意外“损伤”.来电后再次开机,发现IIS里大部分的网站均打不开.均为如下(图01) ...

  5. CSS3学习笔记--media query 响应式布局

    语法:@media screen and (min-width: 320px) and (max-width : 479px) media属性后面跟着的是一个 screen 的媒体类型(上面说过的十种 ...

  6. winform 分页控件

    http://www.cnblogs.com/liuyunsheng/p/4853387.html http://www.cnblogs.com/wuhuacong/archive/2011/07/0 ...

  7. 来不及说什么了,Python 运维开发剁手价仅剩最后 2 天

    51reboot 运维开发又双叒叕的搞活动了—— Python 运维开发 18 天训练营课程, 剁手价1299 最后2天 上课方式:网络直播/面授(仅限北京) DAY1 - DAY4 Python3 ...

  8. hdu 6199 gems gems gems dp

    gems gems gems Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) P ...

  9. ZooKeeper系列(6):ZooKeeper机制架构

    一.ZooKeeper权限管理机制 1.1 权限管理ACL(Access Control List) ZooKeeper 的权限管理亦即ACL 控制功能,使用ACL来对Znode进行访问控制.ACL的 ...

  10. day30 UDP协议

    本周安排 周二 socket编程 周三 粘包处理 周四 选课系统 并发编程 周五多道技术 多进程 周六 IPC 互斥锁 常用模块 os* 操作系统 多数是文件操作 os.path 处理文件路径 shu ...