ASP.NET MVC學習筆記(十二)-利用ActionFilter將未登入使用者該導向指定頁面

ASP.NET MVC學習筆記(十二)-利用ActionFilter將未登入使用者該導向指定頁面

一般網站都會分成前台後台

前台是給使用者操作及管理個人資料的頁面,

後台則是讓網站管理者來管理整個網站功能的頁面。

通常前後台都會需要有登入的頁面來驗證權限

在 .NET MVC 上,驗證登入非常的簡單,

最最最基本的就是在Controller或Action上加[Authorize]的屬性,當使用者未登入時,就會

自動導向到Web.config內定義的登入頁面

image

但為了有個友善的使用者介面,我希望當前台使用者未登入時將他導向到前台的登入頁

當後台的管理者未登入時,導向至後台的登入頁。

今天就來寫一篇小小的文章解決這個問題。

 

以下是我假想的架構:

前台的Member頁面是需要權限的,若未登入則導向預設的/Account/LogOn頁面

後台是用Area切出一個獨立的頁面(名稱就叫Admin),

當未登入時導向指定的/Admin/Default/LogOn頁面 。

 

runtimepng

基本上是利用 ActionFilter 機制,繼承AuthorizeAttribute來實作。

	//繼承AuthorizeAttribute,並Override OnAuthorization()
    public class PermissionFilter : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);
            //判斷!! 當是未登入使用者時
            if (filterContext.Result is HttpUnauthorizedResult)
            {
                //自己寫的Method,用來做判斷未登入使用者是從哪個頁面來的
                CheckPermission(filterContext);
                return;
            }

        }
        private void CheckPermission(AuthorizationContext filterContext)
        {
            object areaName = null;

            //當使用者是從area來的,並且這個area名稱是Admin時(也就是後台管理者未登入時)
            if (filterContext.RouteData.DataTokens.TryGetValue("area", out areaName) 
		&& (areaName as string) == "Admin")
            {
                //導向 /Default/LogOn
                filterContext.Result = new RedirectToRouteResult("Admin_default",
                        new RouteValueDictionary
                       {
                           { "controller", "Default" },
                           { "action", "LogOn" },
                           { "id", UrlParameter.Optional }
                       });
            }
            else
            {
                //否則就直接用預設的登入頁面
                filterContext.Result = new HttpUnauthorizedResult();
            }
        }
    }

這篇只是簡單的說明如何導向,如有需要可以在繼承AuthorizeAttributec後做更多的事情。

就看需求囉。