=x= 🌵 網頁操作權限分流處理及 Yacht Manager - Master Page 後台主版設定。
📌 關於後台的操作權限,資料庫欄位的資料類型設為 bit 並且將預設值設為 ((0)) 代表 False,功用是在所有使用者中,操作權限為 True 者代表老闆或主管角色,只有擁有權限才可進入增刪後台使用者的頁面,其它由老闆或主管新增的後台操作人員,因為權限較低,登入後會被導引至最常使用的新聞發布頁面,並且在側邊欄不會存在使用者管理頁的選項,加上配合在主版設定使用者管理頁是否可見,可以做出讓擁有最高權限者在初次登入時,會被導引至使用者管理頁,而在網頁操作時一但點選其它功能頁,使用者管理頁的選項將消失,唯有再次登入才會導入使用者管理頁,並且利用在主版頁面建立登出清除快取功能,進一步產生登出後,阻止其它人可以使用上一頁看到使用者管理頁的個人資訊,希望能從不同角度防止一些人為操作意外。
using System.Web;
using System.Web.Security;
namespace TayanaYachtRe.Sys
{
    /// <summary>
    /// CheckAccount 的摘要描述
    /// </summary>
    public class CheckAccount : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            // ashx 裡的 Request/Response 都要加上 context
            string ticketUserData = ((FormsIdentity)(HttpContext.Current.User.Identity)).Ticket.UserData;
            string[] ticketUserDataArr = ticketUserData.Split(';');
            bool haveRight = HttpContext.Current.User.Identity.IsAuthenticated;
            //依管理權限導頁
            if (haveRight) {
                if (ticketUserDataArr[0].Equals("True")) {
                    //以驗證票夾帶資料作為限制
                    context.Response.Redirect("User_Manager_Cpage.aspx"); //最高管理員-跳至管理員審核頁面
                }
                else {
                    context.Response.Redirect("new_list_Manager_Cpage.aspx");
                }
            }
            else {
                context.Response.Redirect("Manager_SignIn.aspx"); //導回登入頁
            }
        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}
protected void Page_Init(object sender, EventArgs e)
{
    //清除Cache,避免登出後按上一頁還會顯示Cache頁面
    Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.Cache.SetNoStore();
}
👺 清除快取要放在 Page_Init 才有效果。
🌵 使用 Visual Studio 模擬時的預設快取為 cache-control: private,類似無痕模式,僅限個別使用者使用。
👀 Page_Init 事件參考 : ASP.NET 網頁存留週期概觀
👺 因為執行時會先進到 Master Page 後才進到 Content Page 放在 Master Page 才可以針對每一頁去清除,這樣才有用。
👀 Visual Studio 的快取預設討論 : IIS/ASP.NET responds with cache-control: private for all requests
protected void Page_Load(object sender, EventArgs e)
{
    //權限關門判斷 (Cookie)
    if (!HttpContext.Current.User.Identity.IsAuthenticated) {
        Response.Redirect("Manager_SignIn.aspx"); //導回登入頁
    }
    else {
        //取得驗證票夾帶資訊
        string ticketUserData = ((FormsIdentity)(HttpContext.Current.User.Identity)).Ticket.UserData;
        string[] ticketUserDataArr = ticketUserData.Split(';');
        bool haveRight = HttpContext.Current.User.Identity.IsAuthenticated;
        //依管理權限導頁
        if (haveRight) {
            if (ticketUserDataArr[0].Equals("True")) {
                //以驗證票夾帶資料作為限制,最高權限者使用時顯示使用者管理頁並切換圖示
                ManagerMenuContentPlaceHolder.Visible = true;
                ManagerMainContentPlaceHolder.Visible = true;
                ImageHead.ImageUrl = "assets/images/avatar-4.png";
                ImageMenu.ImageUrl = "assets/images/avatar-4.png";
            }
            else {
                ManagerMenuContentPlaceHolder.Visible = false;
                ManagerMainContentPlaceHolder.Visible = false;
            }
            //載入使用者個人基本資料(渲染畫面)
            LabMenuAccount.Text = ticketUserDataArr[1];
            LabMenuEmail.Text = ticketUserDataArr[3];
            LabHeadUserName.Text = ticketUserDataArr[2];
        }
    }
}
using System;
using System.Web;
using System.Web.Security;
namespace TayanaYachtRe.Sys
{
    /// <summary>
    /// SignOut 的摘要描述
    /// </summary>
    public class SignOut : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            //清除所有的 Session
            if (context.Session != null) {
                context.Session.Abandon();
                context.Session.RemoveAll();
            }
            //建立一個同名的 Cookie 來覆蓋原本的 Cookie
            HttpCookie authenticationCookie = new HttpCookie(FormsAuthentication.FormsCookieName, "");
            authenticationCookie.Expires = DateTime.Now.AddYears(-1);
            context.Response.Cookies.Add(authenticationCookie);
            // 執行登出
            FormsAuthentication.SignOut();
            // 轉向到你登出後要到的頁面
            context.Response.Redirect("Manager_SignIn.aspx", true);
        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}
📢 泛型處理常式對於入門第一次遇到的人來說,看到這種看起來是中文,讀起來不像是中文的東西,會突然有點不知所措,但爬文並看完官網的介紹後,就知道可以把它當成沒有前台只有後置程式碼的網頁處理,你只要連到這個檔案,就幫你直接執行後置程式碼,看到以後就覺得超好用的啦,也有發現能用在下載功能,另外從官網的介紹可以發現還有幾個副檔名很陌生的類型,希望之後有機會能慢慢搞懂。
👀 附上微軟官網介紹 : HTTP 處理常式和 HTTP 模組概觀