Day 6 - Using ASHX File for User Authorization Management with ASP.NET Web Forms C# 使用泛型处理常式进行权限分流

=x= 🌵 网页操作权限分流处理及 Yacht Manager - Master Page 後台主版设定。


权限分流处理介绍 :

📌 关於後台的操作权限,资料库栏位的资料类型设为 bit 并且将预设值设为 ((0)) 代表 False,功用是在所有使用者中,操作权限为 True 者代表老板或主管角色,只有拥有权限才可进入增删後台使用者的页面,其它由老板或主管新增的後台操作人员,因为权限较低,登入後会被导引至最常使用的新闻发布页面,并且在侧边栏不会存在使用者管理页的选项,加上配合在主版设定使用者管理页是否可见,可以做出让拥有最高权限者在初次登入时,会被导引至使用者管理页,而在网页操作时一但点选其它功能页,使用者管理页的选项将消失,唯有再次登入才会导入使用者管理页,并且利用在主版页面建立登出清除快取功能,进一步产生登出後,阻止其它人可以使用上一页看到使用者管理页的个人资讯,希望能从不同角度防止一些人为操作意外。



Master Page - 权限分流实作 :

1. 关於资料库用来作为权限管理的设定,可以参考以下图片

https://ithelp.ithome.com.tw/upload/images/20210919/20139487N5dLKwtioD.jpg

https://ithelp.ithome.com.tw/upload/images/20210919/20139487R5X3T7u0pN.jpg


2. 建立登入页验证成功後会导引到的泛型处理常式 CheckAccount.ashx 在 .cs 档加入程序码

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;
            }
        }
    }
}


3. 在 Yacht Manager -Master Page 侧边栏及内容页各加入两个 ContentPlaceHolder 控制项

  • a. 侧边栏 ContentPlaceHolder-SidebarNormal 用来放共用功能连结。
  • b. 侧边栏 ContentPlaceHolder-SidebarUser 用来放使用者管理连结。
  • c. 主要区块 ContentPlaceHolder-MainNormal 用来放共用功能内容。
  • d. 主要区块 ContentPlaceHolder-MainUser 用来放使用者管理内容。

https://ithelp.ithome.com.tw/upload/images/20210919/20139487GTbX3T68Nq.jpg


4. 在 Yacht Manager - Master Page 後置程序码 Page_Init 事件放入清除快取功能

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();
}

https://ithelp.ithome.com.tw/upload/images/20210919/20139487GNcwbDrSky.jpg

  • 👺 清除快取要放在 Page_Init 才有效果。

  • 🌵 使用 Visual Studio 模拟时的预设快取为 cache-control: private,类似无痕模式,仅限个别使用者使用。

  • 👀 Page_Init 事件参考 : ASP.NET 网页存留周期概观

https://ithelp.ithome.com.tw/upload/images/20210919/20139487ElRSv88IZJ.jpg

5. 在 Yacht Manager - Master Page 後置程序码 Page_Load 事件放入

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];
        }
    }
}
  • 🌵 将权限关门判断放在 Master Page 就不用每一页都写。

6. 在 Yacht Manager - Master Page 的 .aspx 页面的 LogOut 连结 href 位置改成 SignOut.ashx


7. 建立泛型处理常式 SignOut.ashx 并在 .cs 档加入以下程序码执行登出并清空相关资料

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 模组概观

  • 明日将介绍如何制作短网址功能。

<<:  DAY5 - Side Project 主题:90天原子习惯挑战

>>:  [Day 19] 针对网页的单元测试(五)

Day 03 - 动态调整的PM职涯规划(2)

图片来源 继续上一篇的目标设定, 有时候我觉得是因为你心中已有一个"既定的目标"...

Day10. 如何收拾需求变更的Boss,Blue Prism的降临 -BP改变流程Excel另存新档

做专案最怕就是一连串因应单位政策的改变而变更需求, 原本可以运作达成需求的系统,眼看就要结案, 却需...

【Day 01】从零开始的 Line Chatbot 系统-序章

暑假後期,指导教授给了第三届 Line Chatbot 设计大赛的资讯。 虽然比赛内容主要放在设计、...

C# .WebAPI Tuple 回传空白的问题

近期将依些老程序转移至微服务上, 因为原本程序使用了大量 out 语法, 为了能够让微服务的 API...

QUIC.cloud CDN 与 CloudFlare 新手教学

环境准备 使用 Cloudflare DNS 安装 LiteSpeed Cache plugin ...