• 关于.net中的身份认证(AuthorizeAttribute)的问题


     

      引言

        新公司当初面试的时候问了我很多用户验证的问题,这里就把我的对于验证的想法写一下,希望可以有一个系统的学习记录。

      一、如何验证

        B/S结构的请求是http请求,个人理解的http请求有两个特点:1、无状态 2、短连接  (下篇文章会说一下我个人对于http连接的想法)。所以一个请求是否是我们系统的用户我们一般是用Session和Cookie来判断的。请求又可以分为两种,一种是页面的请求,一种是数据API的ajax请求。所以一个判断请求是否是系统用户可以这么写

        

     public void HasLogin(HttpContextBase httpContext)
            {
                //判断用户登录信息是否存在,这里是用Session,有的用Cookie(加密)
                if (httpContext.Session["UserInfo"] == null)
                {   
                    //如果是AJAX的API请求
                    if (httpContext.Request.IsAjaxRequest())
                    {
                        //这边处理错误API请求反馈,一般是反馈错误提示
                    }
                    else
                    {
                        //这边是页面请求,如果是未登录的话直接跳转到登录页面
                    }
                }   
            }

      二、如何使用

        有了验证的逻辑之后就可以通过重写.net自己的AuthorizeAttribute类来实现用户身份验证了。AuthorizeAttribute类有两个重要的方法:AuthorizeCore和HandleUnauthorizedRequest。其中AuthorizeCore函数是用来判断一个请求是否通过用户验证,它的返回结果是一个bool。HandleUnauthorizedRequest函数则是在AuthorizeCore返回结果是false时会调用的函数。源代码如下所示

        从图中可以看出当AuthorizeCore函数结果为false时,就会触发HandleUnauthorizedRequest函数来处理验证失败。所以我们可以自定义一个AuthorizeAttribute类的子类并重写上面的两个方法。

        

    protected override bool AuthorizeCore(HttpContextBase httpContext)
            {
                if (httpContext.Session["UserInfo"] == null)
                {
                    return false;
                }
                return true;
            }
    
            protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
            {
                //如果是Ajax请求
                if (filterContext.HttpContext.Request.IsAjaxRequest())
                {
                    filterContext.Result = new JsonResult
                    {
                        Data = new
                        {
                            ResultCode = ResultCode.Exception,
                            ResultMess = "请求用户未登录!"
                        }
                    };
                }
                else
                {
                    //处理Url请求
                    //验证不通过,直接跳转到相应页面,注意:如果不使用以下跳转,则会继续执行Action方法 
                    filterContext.Result = new RedirectResult("/Home/Index");
                }
            }

      三、添加AuthorizeAttribute过滤

         我们自定义个AthorizeAttribute已经实现了,接下来就是在控制器上面实现了。具体实现方法有三种

        1、Controller层级添加

        

         2、Action层级添加

        

        3、全局添加

        

        (这个过滤器配置可以在Global.asax中看到)

      四、取消过滤

          有些页面,例如登录页面、登录请求的时候用户是肯定还没有登录的,这个时候如果我用了全局添加的话,用户岂不是永远无法登录了?那么为了使某些特定的方法可以不用验证过滤可以在特定Action、Controller上面添加以下抬头

            

    AllowAonymous表示一个特性,该特性用于标记在授权期间要跳过 System.Web.Mvc.AuthorizeAttribute 的控制器和操作

       

      总结

        由于本人也是才疏学浅,改文章也是为了记录学习。如果文中有不足或者错误之处还请大家指出。谢谢

  • 相关阅读:
    cocos2dx的发展的例子2048(加入动画版)
    Hibernate操作Clob数据类型
    json级联城市
    Ubuntu Linux 永山(mount)分
    C++出现计算机术语5
    Cocos2d-x 3.0 红孩儿私人义务教育
    大页(huge pages) 三大系列 ---计算大页配置参数
    EJB_消息驱动发展bean
    HDU5086Revenge of Segment Tree(数论)
    第五章_JSTL
  • 原文地址:https://www.cnblogs.com/moshanghuakai/p/9667750.html
Copyright © 2020-2023  润新知