2020.10.22-MVC5過濾器(許可權認證)與checkbox傳值的相關問題

MrLss發表於2020-10-22

一、checkbox傳值:通過Name屬性值獲取 使用者選中的項資料,會序列化成陣列形式傳遞
在這裡插入圖片描述
後臺程式碼:
在這裡插入圖片描述


二、MVC5的許可權驗證AuthorizeAttribute

using Microsoft.Ajax.Utilities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Helpers;
using System.Web.Management;
using System.Web.Mvc;

namespace RM_MVC._2020._10._21.Models
{
    /// <summary>
    /// 指定空明知其或Action的訪問只限於滿足授權的使用者
    /// </summary>
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
    public class UserInfoAuthorizationAttribute : AuthorizeAttribute
    {
        public string loginUri { get; set; }
        //不同專案的登入Action 可能不一樣 
        public UserInfoAuthorizationAttribute(string loginUrl = "~/UserInfo/Index")
        {
            this.loginUri = loginUrl;
        }
        /// <summary>
        /// 認證校驗
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnAuthorization(AuthorizationContext filterContext)
        {


            //判斷是否跳過授權過濾器
            if (filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true)
                || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true))
            {
                return;
            }
            else
            {
                if (filterContext.HttpContext.Session["CurrentUseInfo"] == null || !(filterContext.HttpContext.Session["CurrentUseInfo"] is Userinfo))
                {
                    //如果是Ajax請求 返回Json資料
                    if (filterContext.HttpContext.Request.IsAjaxRequest())
                    {
                        //filterContext.Result = new ContentResult() { Content = "NO-請登入" };
                        //返回son字串
                        filterContext.Result = new JsonResult() { JsonRequestBehavior = JsonRequestBehavior.AllowGet, Data = new { msg = "請登入", code = 0 } };
                    }

                    //記住使用者請求的URL,登陸成功以後自動跳轉至該頁面
                    filterContext.HttpContext.Session["FirstUrl"] = filterContext.HttpContext.Request.Url.AbsoluteUri;

                    //如果不是Ajax,就直接獲取或設定由Action返回的結果(跳轉頁面)
                    filterContext.Result = new RedirectResult(this.loginUri);

                }
                else
                {
                    //已有登入 略過不處理(日誌。。)
                    return;
                }
            }

            //base.OnAuthorization(filterContext);
        }
    }
}

使用方式:class action 全域性:
在這裡插入圖片描述
在這裡插入圖片描述
1.登入(Login)控制器或者Action不需要認證、使用AllowAnonymous特性忽略認證
在這裡插入圖片描述
2.只打上特性標籤還遠遠不夠、需要在你許可權認證的時候,加判斷。
在這裡插入圖片描述
3.這樣使用者在請求登入頁面的時候不會造成死迴圈(無限重定向)、
在這裡插入圖片描述


三、Error自定義全域性過濾器:
在這裡插入圖片描述
在這裡插入圖片描述
使用方式:class action 全域性:
在這裡插入圖片描述
在這裡插入圖片描述
△:自定義異常處理程式能捕獲哪些異常資訊?

1.Action異常、沒被捕獲
2.Action呼叫Servicec服務異常(異常throw傳遞)
3.Action正常、View檢視異常
4.許可權驗證時異常(Authorization)

△:自定義異常處理程式不能捕獲到哪些異常資訊?

1.控制器建構函式異常不能被捕獲。(控制器被構造後,才有Filter)
2.訪問Action時名稱出錯 (與Route相關、與MVC處理程式無關)

△:怎麼解決這些漏網之魚?實現可以全面捕獲異常的組合?
註冊Global檔案裡的Application_Error() 事件–全域性異常處理事件函式在這裡插入圖片描述


四、Action過濾器:
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
擴充套件:Action過濾器也可以使用Controller基類實現
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述


五、過濾器(執行順序)以及改變方式

如果一個Action同時應用了 Action過濾、Class過濾、全域性過濾
預設由外到內–>由內到外 這個執行順序
改變順序---->使用Order屬性 值越大 優先觸發過濾事件

[ActionFilterAttribute(order = 15 )]
[ControllerFilterAttribute(order = 50 )]
[OverallFilterAttribute(order = 5 )]


六、Action(執行順序)異常捕獲 圖片
在這裡插入圖片描述

相關文章