iT邦幫忙

2022 iThome 鐵人賽

DAY 19
0
自我挑戰組

Bug仔的筆記本系列 第 19

實作一個跳轉到其他登入頁的 ActionFilter

  • 分享至 

  • xImage
  •  

昨天收到一個需求,如果使用者沒有登入,則依欲瀏覽的網頁不同,導向至不同登入頁。

目前維護的是一個 ASP.NET MVC 網站,其中有些頁面是學生登入才看得到,有的頁面是老師登入才看的到。

然後前人就把學生跟老師個別做了登入頁...。

所以同一個站台上有學生登入頁與老師登入頁...

現在專案的身分驗證,預設是導向到學生的登入頁,PM 希望如果是瀏覽老師相關的頁面,應該導向至老師登入頁。

我找到兩個方法,今天講一個比較偷吃步的方法。明天再講比較漂亮的辦法。

實作 ActionFilter

ActionFilter,可以幫我們在 Controller 的 Action 執行前後作一些額外的處理。

目前專案的設定,只要沒登入,就跳轉到預設的學生登入頁。所以我只要在學生登入頁的 Action 上方,讓ActionFilter 去檢查,原本登入成功的話要導向的地方,如果是老師相關頁,那就直接導向至老師登入頁就可以了!

ActionFilter 有四個可以覆寫的方法。

  1. OnActionExecuting – 在執行 Action 之前執行
  2. OnActionExecuted – 在執行 Action 之後執行
  3. OnResultExecuting – 在執行 Action Result 之前執行
  4. OnResultExecuted – 在執行 Action Result 之後執行

這次我們實作 OnActionExecuting 來實踐,進到 Action 前先判斷。

public class TeacherLoginRedirectAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // 取得原本登入成功要導向的網址
        var returnUrl = filterContext.HttpContext.Request.QueryString["returnUrl"];

        // 判斷是否是老師權限相關路徑
        if (returnUrl.StartsWith("/teachers"))
        {
            filterContext.Result = new RedirectToRouteResult(
                                        new RouteValueDictionary(new
                                        {
                                            action = "login",
                                            controller = "teachers",
                                            returnUrl
                                        }));
        }
    }
}

https://ithelp.ithome.com.tw/upload/images/20221004/20120420aBAbcHHbuH.png

這個做法我覺得不漂亮,不過我看了MVC 授權 - 多個登錄頁面 (MVC Authorization - multiple login pages),裡面提到的幾個方法後,以維護這個 超蝦 專案的角度來說,我感覺今天講的這個方法稍微好一點。

而且以後,如果其他頁面也要預設用老師登入頁登入的話,我只要維護這個 ActionFilter 就好,不用每個 Action 各自加 Attribute。至於之後我不在的話,後續維護的人能不能立刻發現這段程式碼,我感覺難說XD

至少目前完成了這個需求,而且更改的地方也不多。要不然再看下去會一直萌生打掉重練登入驗證機制的想法 XD

雖然明天的我一定會重改一次,但今天的我感到很滿意 :D


上一篇
SQL Server 的 #Table 與 ##Table 暫存表
下一篇
從 Owin 調整未登入用戶的跳轉邏輯
系列文
Bug仔的筆記本30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言