代码调用顺序为:OnAuthorization-->AuthorizeCore-->HandleUnauthorizedRequest

如果AuthorizeCore返回false时,才会走HandleUnauthorizedRequest 方法,并且filterContext.Result是HttpUnauthorizedResult类型(注:StausCode=401),401错误又对应了Web.config中的

<authentication mode="Forms">
      <forms loginUrl="~/"
timeout="2880" />
    </authentication>

所以,AuthorizeCore==false 时,会跳转到 web.config 中定义的  loginUrl="~/"

public class CheckLoginAttribute : AuthorizeAttribute
    {

protected override bool AuthorizeCore(HttpContextBase
httpContext)        {
            bool Pass = false;
            if
(!CheckLogin.AdminLoginCheck())
            {

httpContext.Response.StatusCode = 401;
                Pass =
false;
            }
            else
            {
               
Pass = true;
            }

return Pass;
        }

protected override void
HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {

if(filterContext.HttpContext.Request.IsAjaxRequest())
           
{
                if (!App.AppService.IsLogon)
                {

filterContext.Result = new JsonResult
                                              
{
                                                   Data = new {IsSuccess =
false, Message =
"不好意思,登录超时,请重新登录再操作!"},
                                                  
JsonRequestBehavior =
JsonRequestBehavior.AllowGet
                                              
};
                    return;    //由于JsonResult无对应StatusCode,而在AuthorizeCore中我们把httpContext.Response.StatusCode=401,所以会跳转到 web.config 中定义的  loginUrl。猜想: filterContext.Result可以赋值为                                                    //RedirectResult、HttpUnauthorizedResult等,若没有StatusCode(像JsonResult),则会检查Response.StatusCode

}
           
}
            if (App.AppService.IsLogon)
            {
               
return;
            }

base.HandleUnauthorizedRequest(filterContext);
            if
(filterContext.HttpContext.Response.StatusCode == 401) //对于401错误,默认会跳转到web.config 中定义的  loginUrl
           
{
                filterContext.Result = new
RedirectResult("/");
            }
        }

}

MVC中使用AuthorizeAttribute注意事项的更多相关文章

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

    话说来到上海已经快半年了,时光如白驹过隙,稍微不注意,时间就溜走了,倒是没有那么忙碌,闲暇之际来博客园还是比较多的,记得上次在逛博问的时候看到有同志在问MVC中Cookie过期后如何作相关处理,他在阐 ...

  2. MVC中使用AuthorizeAttribute做身份验证操作

    代码顺序为:OnAuthorization-->AuthorizeCore-->HandleUnauthorizedRequest 如果AuthorizeCore返回false时,才会走H ...

  3. MVC中使用AuthorizeAttribute做身份验证操作【转】

    http://blog.csdn.net/try530/article/details/7782704 代码顺序为:OnAuthorization-->AuthorizeCore-->Ha ...

  4. 在ASP.NET MVC 3 中自定义AuthorizeAttribute时需要注意的页面缓存问题

    一.ASP.NET MVC中使用OutputCache实现服务器端页面级缓存 在ASP.NET MVC中,假如我们想要将某个页面(即某个Action)缓存在服务器端,可以在Action上标上以下特性: ...

  5. MVC中的成员资格,授权,安全性

    使用 Authorize 特性登录 Authorize 是 ASP.NET MVC 自带的默认授权过滤器, 可用来限制用户对操作方法的访问. 保护控制器操作 Authorize 特性在表单身份验证和 ...

  6. 在MVC中使用async和await的说明

    首先,在mvc中如果要用纯异步请不要使用async和await,可以直接使用Task.Run. 其次,在mvc中使用async和await可以让系统开新线程处理Task的代码,同时不必等Task执行结 ...

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

    本示例演示了在ASP.NET MVC中进行基于URL的权限控制,由于是基于URL进行控制的,所以只能精确到页.这种权限控制的优点是可以在已有的项目上改动极少的代码来增加权限控制功能,和项目本身的耦合度 ...

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

    某些安全性较高的网页,如网上支付或用户登陆页面,可能会使用到https(SSL/TLS)来提高安全性.本文介绍了如何在ASP.NET MVC中强制某action使用https和如何进行向https页面 ...

  9. 关于MVC的特性(AuthorizeAttribute)的一些理解

    许多 Web 应用程序要求在用户登录之后才授予其对受限制内容的访问权限. 在某些应用程序中,即使是登录的用户,也会限制他们可以查看的内容或可以编辑的字段. 要限制对 ASP.NET MVC 视图的访问 ...

随机推荐

  1. 使用gcc编译gdb调试

    gcc 在linux系统中,默认是没有安装gcc编译器的,可以通过命令 rpm -q | grep gcc 来查看.安装命令为: yum -y install gcc 安装后,编写一个.c结尾的文件. ...

  2. LVM 创建分区扩展分区记录

    LVM 原理   图片来自百度百科   测试环境centOS 7                 LVM version:     2.02.115(2)-RHEL7 (2015-01-28)     ...

  3. 基于RealSense的坐姿检测技术

    计算机的飞速普及,让人们将越来越多的工作放在计算机上去完成,各行各业,尤其是程序开发人员.文字工作者,在计算机上的工作时间越来越长,这种情况下不良的坐姿对颈肩腰椎都会产生很大影响,容易导致多种疾病的发 ...

  4. 清除XCode缓存和生成文件

    1.Command-Option-Shift-K to clean out the build folder XCode4.2    finder中找到   /Users/apple/Library/ ...

  5. js 控制div 显示隐藏的问题

    var divs = document.getElementsByTagName("div");得到所有的divfor(var i=0;i<divs.length;i++){ ...

  6. UIDatePicker的时间选择器里的时区的问题

    转自:http://www.cocoachina.com/bbs/simple/?t70445.html 初始化代码: - (void)viewDidLoad { [super viewDidLoad ...

  7. c#线程问题(3)

    //执行回调函数 static void Main(string[] args) { UPPER = ; Thread thread1=new Thread(sops); thread1.Name = ...

  8. day05 Java基础

    1.数组初始化:为数组开辟内存空间,并为每个数组元素赋予值.数组初始化方式: 方式一:动态初始化:初始化时只指定数组长度,由系统为数组分配初始值. 格式:数组类型[] 数组名称=new 数组类型[数组 ...

  9. Qt之遍历文件夹

    关于Qt操作文件夹.文件的知识用途较多,比如遍历下一层乃至所有子孙文件.文件夹,获取它们的一些信息(大小.类型.最后更改时间等).当然,也可以进行级联删除.     首先看简单的:   一.Qt遍历文 ...

  10. linux后端运行

    程序命令 & :将命令放入后台运行. Ctrl + z : 把一个正在运行的前端命令转移到后台运行,它等效于:程序命令 & :这样虽然把程序放在了后端运行,但是此时程序状态为暂停状态, ...