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

话说来到上海已经快半年了,时光如白驹过隙,稍微不注意,时间就溜走了,倒是没有那么忙碌,闲暇之际来博客园还是比较多的,记得上次在逛博问的时候看到有同志在问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 about
38         //     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 about
76         //     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 login
23                 RedirectToLoginPage(filterContext);
24                 return;
25             }
26             //if success add login data to context
27         }
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.AllowGet
39                 };
40                 return;
41             }
42 else
43 {
44          //返回登录页面的相关处理..........
45 }}

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

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

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

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

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

时间: 2024-11-03 21:50:19

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

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

个人笔记 问题重现 在asp.net mvc中,使用资源文件会出现一个问题,例如: 紧接着我进入视图界面,输入下面代码: 1 <a href="javascript:void(0);">测试@KuaiLeYouNi.Web.AppResource.Space</a> 以上编译不会报错,但是运行是会报错:“编译器错误消息: CS0122: “KuaiLeYouNi.Web.AppResource”不可访问,因为它受保护级别限制” 问题解决 原来资源文件默认的访问修

Asp.Net MVC 中实现跨域访问

在ASP.Net webapi中可以使用  Microsoft.AspNet.WebApi.Cors  来实现: public static class WebApiConfig { public static void Register(HttpConfiguration config) { // New code config.EnableCors(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: &

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

正题前的唠叨 本人是才出来工作不久的小白菜一颗,技术很一般,总是会有遇到一些很简单的问题却不知道怎么做,这些问题可能是之前解决过的.发现这个问题,想着提升一下自己的技术水平,将一些学的新的'好'东西记录下来,一是加深印象:二是以后可以作为参考:三是希望博友们可以提出不足和可以优化的地方,一起讨论. 这个是我去一家公司没多久,让我做的小功能,主要是导出excel并在浏览器下载下来. 但是会有不同的细微的需求差别. 第一次发博客,有描述不清楚的地方还请见谅,希望各位多多指点. 进入正题 简单的需求描

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

使用过ASP.NET AJAX的朋友都知道,怎么通过ASP.NET AJAX在客户端访问WebService,其实在ASP.NET MVC中使用ASP.NET AJAX异步访问WebService 也没什么大的差别. 在ASP.NET应用程序里使用ASP.NET AJAX访问WebService通常都是通过ScriptMananger引入WebService生成客户端代理的方法,同时也可以使用Microsoft Ajax Library来完成.本文将介绍在ASP.NET MVC中使用ASP.NE

Asp.NET MVC 中使用 SignalR 实现推送功能

一,简介 Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重新发送请求或使用轮询技术来获取消息. 可访问其官方网站:https://github.com/SignalR/ 获取更多资讯. 二.Asp.net SignalR 是个什么东东 Asp.net SignalR是微软为实现实时通信的一个类库.一般情况下,SignalR会使用JavaScript的长轮询(lo

在 Asp.NET MVC 中使用 SignalR 实现推送功能 [转]

在 Asp.NET MVC 中使用 SignalR 实现推送功能 罗朝辉 ( http://blog.csdn.net/kesalin ) CC许可,转载请注明出处 一,简介 Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重新发送请求或使用轮询技术来获取消息. 可访问其官方网站:https://github.com/SignalR/ 获取更多资讯. 二,实现机制

在 ASP.NET MVC 中使用 HTTPS (SSL/TLS)

某些安全性较高的网页,如网上支付或用户登陆页面,可能会使用到https(SSL/TLS)来提高安全性.本文介绍了如何在ASP.NET MVC中强制某action使用https和如何进行向https页面的跳转.我们先实现强制一个action使用https.这里写了一个RequireHttpsAttribute,它的作用是将非https连接转换成https连接,这样所有使用了RequireHttps这个filter的controller都会强制使用https连接. 1 using System.We

在ASP.NET MVC中实现基于URL的权限控制

本示例演示了在ASP.NET MVC中进行基于URL的权限控制,由于是基于URL进行控制的,所以只能精确到页.这种权限控制的优点是可以在已有的项目上改动极少的代码来增加权限控制功能,和项目本身的耦合度低,并且实现起来也比较简单.缺点是权限控制不够精确,不能具体到某一具体的按钮或者某一功能. 在数据库中新建2个表.PermissionItem表用于保存权限ID和页面路径的关系,一个权限ID可以有多个页面,一般同一个权限ID下的页面是为了实现同一个功能.PermissionList表用于保存用户所具

ASP.NET MVC中使用窗体验证出现上下文的模型在数据库创建后发生更改,导致调试失败

在ASP.NET MVC中使用窗体验证.(首先要明白,验证逻辑是应该加在Model.View和Controller哪一个里面?由于Model的责任就是负责信息访问与商业逻辑验证的,所以我们把验证逻辑加在Model里面.) 第一步:引用下面这个命名空间 第二步:添加验证 第三步:启动调试,出现以下问题: 解决方法: 超链接中包含了解决这个问题的详细介绍,也就是通过Code First数据库迁移的方式让Entity Framework帮助我们自动调整数据库里面的架构. 解决这个问题最简单的方法就是将