(.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視圖

 

四、過濾器的使用

  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) 在需要授權時調用

    5.  過濾器的其他實現方式

      1. 在"控制器"中重寫過濾器接口的方法,因爲Controller類實現了各種過濾器接口

  2. 過濾器應用方式小結

    1. 過濾器的三種應用方式

      1. 用到動作方法:作用於該動作方法

      2. 用到控制器:作用與所有動作方法

      3. 用到整個程序:作用於所有動作方法

    2. FilterConfig.cs文件

      1. 作用:註冊全局過濾器

      2. 默認:已將錯誤處理作爲全局過濾器

      3. 擴展:可以添加自己定義的過濾器爲全局過濾器

  3. 同類過濾器的執行順序

    1. 類上的過濾器優先於方法上的過濾器

    2. 按照Order屬性值從小到大執行(Order默認爲-1)//[ActionFilter(Order=1)]

    3. 控制器重寫的過濾器接口方法優先執行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章