(.NET进阶八)身份认证与授权/Authrize特性/Filter过滤器

作者:神秘网友 发布时间:2020-09-09 00:03:35

(.NET进阶八)身份认证与授权/Authrize特性/Filter过滤器

(.NET进阶八)身份认证与授权/Authrize特性/Filter过滤器

目录

 

一、身份验证与授权

二、使用Authrize特性实现授权

三、网站错误处理

四、过滤器的使用


一、身份验证与授权

  1. 身份认证与Session对象
    1. 基于Session保存用户状态和信息
      1. 基于Session保存用户状态和信息,比如登录信息,相当于授权
      2. 在访问具体页面时,如果检测到没有登录,则禁止用户某些操作
    2. 不足之处
      1. Session具有生命周期,超过规定时间,用户必须重新登录
      2. Session有各种丢失的可能,如服务器重启,内存回收等,这样影响用户的体验
    3. ASP.NET身份验证
           验证方式                                      说                  明                         
      Windows 使用Windows操作系统和NTFS文件系统验证,适合公司内部站点使用,不适合大众商业站点
      Forms 利用网页向客户端发送凭证,客户端再把凭证提交给应用程序进行身份验证(使用最普遍)
      Passport 一种单点登录标准(微软提供,使用需要付费,国内采用的较少)
      Federated 一种单点登录标准(谷歌提供的一种联合身份验证的标准)

       

    4. 关于Forms验证

      1. 在实际开发中应用最普遍

      2. 最初由亚马逊网站开发使用,在内部使用Cookie来维护页面之间的状态

      3. 在ASP.NET MVC中提供了一个FormsAuthentication类专门用于身份认证服务

      4. FormsAuthentication类的一个功能就是写入一个标识用户身份的Cookie

    5.  

      FormsAuthentication类

       

       

           属性或方法                                                说               明
      string LoginUrl 用户访问且验证不通过时,重定向到登录页面的Url
      TimeSpan TimeOut 获取身份验证票证到期前的时间量
      void SetAuthCookie(string userName,bool createPersistentCookie) 为提供的用户名创建一个身份验证票据,并将该票据添加到响应的Cookie集合或URL中,常用于登录
      void SignOut() 从浏览器删除Forms身份验证票据,常用于注销
      string Encrypt(FormsAuthenticationTicket ticket) 将验证票据对象加密成一个字符串
      FormsAuthenticationTicket Decrypt(string encryptedTicket) 将加密过的用户身份票据字符串解密成一个票据对象

       

  2. 实现Form验证

    1.  

      编写带有身份验证的登录动作方法(在控制器那种编写登录方法)

       

      [HttpPost]
      public ActionResult AdminLogin(SysAdmin objAdmin)
      {
          string adminName = new SysAdminManager().AdminLogin(objAdmin);//调用业务逻辑
          if(adminName != null)
          {
              FormAuthentication.SetAuthCookie(adminName,false);//true表示cookie用不过期,除非客户端主动清除了Cookie
              ViewBag.Info="欢迎您:"+adminName;
          }
          else
          {
              ViewBag.Info="用户名或密码错误";
          }
      
          return View("AdminLogin");
      }

       

    2. 使用User对象检查用户是否已经验证

      1.  

        User对象封装了用户身份票据,可用于控制代码的权限

         

        //在需要进行验证判断的控制器中修改方法
        public ActionResult Index()
        {
            
            if(this.User.Identity.IsAuthenticated)
            {
                string adminName = this.User.Identity.Name;//获取写入的adminName
                ViewBag.adminName = adminName;
                return View("StudentManager");
            }
            else
            {
                 return RedirectToAction("Index","SysAdmin");
            }
        }
        

         

    3. 修改web.config配置文件(网站根目录),修改路由的默认值

      //网站根目录的配置文件
      <system.web>
          <compilation debug="true" targetFramework="4.0"/>
      
          <authentication mode="Forms">
              <forms loginURL="~/SysAdmin/Index" timeout="2880"/>
          </authentication>
      </system.web>
      
      --mode:验证方式(Forms,None,Password,Windows)
      --loginUrl:当用户直接访问带有验证检测页面时,验证如果没通过,跳转到的URL
      --timeOut:Cookie的有效期,单位为“分钟”,2880表示两天
      
      
      
      //修改默认路由
      routes.MapRoute(
          name:"Default",
          url:"{controller}/{action}/{id}",
          defaults:new {controller = "Student",action = "Index",id = UrlParameter.Optional}
      
      );

       

  3. 用户注销

    1.  

      用户登陆后,根据需要可以注销当前用户票证

       

      public ActionResult AdminExit()
      {
          FormAuthentication.SignOut();//从浏览器中删除Forms身份验证票证
          Session["CurrentAdmin"] = null;//从Session清除
          return View("AdminLogin");//返回登录界面
      }
      
      <div id="container">
          <h2>
              <a href = "~/SysAdmin/AdminExit">注销</a>
          </h2>
      </div>

       

二、使用Authrize特性实现授权

  1. Authrize特性-方便的实现授权
    1. 应用在控制器上:拥有票据的用户具备访问控制器内所有动作方法的权限
    2. 应用到动作方法:拥有票据的用户具备访问该动作方法的权限
      [Authrize]
      public class StudentController:Controller
      
      
      
      
      [Authrize]
      public ActionResult Index()
      {
          ......
      }
      
      
      
      //使用Authrize特性实现授权和User对象效果相同

       

  2. 按照用户名授权

    //保存在Cookie中的用户名
    [Authrize(Users = "张三")]
    public ActionResult Index()
    {
        ......
    }

     

三、网站错误处理

  1. try catch语句的局限性
    1. 一般适合语句的语句的错误处理,不适合页面不存在等问题的处理
  2. 使用Web.config整个站点错误处理配置
    1. 使用web.config错误处理典型配置(在<system.web>节点中)
      <customErrors defaultRedirect = "~/ErrorPage.htm" model="RemoteOnly">
          <error stausCode="404" redirect="~/FileNotFound.htm">
      </customErrors >
      
      
      --defaultRedirect :发生错误时,浏览器重定向到的URL
      --model:On表示启用自定义错误,Off表示禁用自定义错误,RemoteOnly向远程客户端显示自定义错误,并向本地主机显示ASP.NET错误
      --redirect:发生该状态的错误时重定向的页面
      --stausCode:403 禁止访问,404未找到文件,500 内部服务器错误

       

    2. Web.config配置的局限性

      1. 针对整个站点的错误,配置错误页面,但是这些信息显示一般比较模糊

      2. 如果针对某种类型的控制器,甚至动作方法,显示更具体的信息,使用Web.config方式不合适

      3. 使用try catch也不合适(业务代码和错误代码混编)

  3. 使用HandleError处理错误(应用此特性后,web.config中定义的错误处理配置将失效)

    1. 特性:针对动作方法更方便的错误处理显示方式

      //在控制器中添加特性
      [HandleError(ExceptionType = typeof(System.Exception),View="Error")]
      public ActionResult GetStuList(string className)
      {
          ......
      }
      
      --ExceptionType 捕获异常的类型
      --View:特定的Error视图,创建在当前控制器的对应View文件夹或shared文件夹中
    2. Error视图中的处理
      1. 发生错误时,HandleError会将异常信息封装成一个HandleErrorInfo对象,传向Error视图(.NET进阶八)身份认证与授权/Authrize特性/Filter过滤器

 

四、过滤器的使用

  1. 过滤器的简介
    1. 作用:
      1. 调用动作方法之前或调用后执行一些业务逻辑,如检查授权。本质就是对动作方法的执行过程进行干预
      2. 提供一种向控制器行为方法中添加“前行为”和“后行为”的方法
    2. 理解
      1. 在ASP.NET MVC中继承自FilterAttribute的类统称为过滤器
      2. 其实Authrize、HandleError,OutputCache这些类都直接或间接继承自FilterAttribute
    3. 分类
      1. Authrize(授权):该过滤器用来限定进入控制器的行为
      2. HandleError(处理错误):该过滤器用来制定一个行为,这个行为用来处理某个行为方法中抛出的异常
      3. OutputCache(缓存):该过滤器用来为行为方法提供输出缓存
      4. 自定义过滤器:开发者自己根据需要创建的过滤器,如日志,权限等
    4. 过滤器常见接口
      接口类型                                              方法 说明
      IActionFilter void OnActionExcuted(ActionExcutedContext filterContext) 在执行动作方法后调用
        void OnActionExcuting(ActionExcutingContext filterContext) 在执行动作方法前调用
      IResultFilter void OnResultExcuted(ResultExcutedContext filterContext) 在操作结果执行之后调用
        void OnResultExcuting(ResultExcutingContext filterContext) 在操作结果执行之前调用
      IExceptionFilter void OnException(ExceptionContext filterContext) 在发生异常时调用
      IAuthorizationFilter void OnAuthorization(AuthorizationContext filterContext) 在需要授权时调用

      (.NET进阶八)身份认证与授权/Authrize特性/Filter过滤器

    5.  过滤器的其他实现方式

      1. 在"控制器"中重写过滤器接口的方法,因为Controller类实现了各种过滤器接口

  2. 过滤器应用方式小结

    1. 过滤器的三种应用方式

      1. 用到动作方法:作用于该动作方法

      2. 用到控制器:作用与所有动作方法

      3. 用到整个程序:作用于所有动作方法

    2. FilterConfig.cs文件

      1. 作用:注册全局过滤器

      2. 默认:已将错误处理作为全局过滤器

      3. 扩展:可以添加自己定义的过滤器为全局过滤器

  3. 同类过滤器的执行顺序

    1. 类上的过滤器优先于方法上的过滤器

    2. 按照Order属性值从小到大执行(Order默认为-1)//[ActionFilter(Order=1)]

    3. 控制器重写的过滤器接口方法优先执行

(.NET进阶八)身份认证与授权/Authrize特性/Filter过滤器

(.NET进阶八)身份认证与授权/Authrize特性/Filter过滤器相关教程

  1. LightningChart.NET创建3D SurfaceGrid图表教程
  2. 并发进阶
  3. .NetCore之下载文件
  4. SpringBoot进阶学习
  5. JMeter的稍微进阶使用(请求头接口参数传递)
  6. 对于VB.NET 写windows 服务的权限。(可以对C盘等进行读写等等)
  7. 如何在 ASP.NET 应用程序中实现模拟用户身份(在ASP.NET中以管理
  8. .net自定义WebService WSDL