1. 程式人生 > >初識ASP.NET MVC窗體驗證與許可權過濾---2.基於角色的訪問控制

初識ASP.NET MVC窗體驗證與許可權過濾---2.基於角色的訪問控制

          上一篇完成了窗體身份驗證並在客戶端儲存了鑑權cookies,系統已經知道我已經登入並獲得了授權。但僅僅知道登入了是不夠的,還要對能夠訪問的區域做出控制。男人不能進女廁所,女人不能進男廁所O(∩_∩)O哈哈~
          這裡就要來扯一扯AOP了,AOP是所謂的面向切面程式設計。聽著好高階的樣子。其實無非就是很多縱向解決起來很困難的問題,我們可以橫向來解決。ASP.NET的管道事件,就是標準的AOP思想。
         在所有請求都必然會經過的地方設定處理邏輯。就像在水管上佈置一道濾網。ASP.NET的提供了豐富的管道處理事件,可以在其中做很多事情。在MVC中一樣也可以使用ASP.NET的管道事件來完成全域性的邏輯。
        mvc使用過濾器來實現AOP,過濾器與ASP.NET管道相比,其粒度更細更為靈活。管道是全域性的,而過濾器可以精確到controller,action,而且mvc中的過濾器使用了特性標記的方式應用,非常的簡潔優雅。
         在Global.asax中新增如下程式碼,在建構函式中把驗證邏輯註冊到驗證事件上:

 public MvcApplication()
        {
            AuthorizeRequest += new EventHandler(MvcApplication_AuthorizeRequest);
        }

        void MvcApplication_AuthorizeRequest(object sender, EventArgs e)
        {
            var id = Context.User.Identity as FormsIdentity;
            if (id != null && id.IsAuthenticated)
            {
                var roles = id.Ticket.UserData.Split(',');
                Context.User = new GenericPrincipal(id, roles);
            }
        }
       驗證過程如下,讀取在context上下文中儲存在客戶端的鑑權cookie,如果存在且經過驗證,就把角色string[]陣列和加密的身份ID儲存到上下文的User物件中,然後為跳轉的控制器新增過濾器:
namespace AuthStudy.Controllers
{
    public class MainController : Controller
    {
        [Authorize(Roles = "Manager")]
        public ActionResult Index()
        {
            return View();
        }
    }
}
      Authorize是mvc自帶的驗證過濾器,Roles表示了可以訪問的角色列表,若無roles表示任何授權使用者均可訪問。此處注意過濾器是加在Acion上的,也就是說只有這個頁面進行了許可權過濾。對應頁面如下:
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>
        我已經獲得授權!<br />
        我的使用者名稱是: @Session["username"]<br />
        我的角色是:@Session["roles"]<br />
        session超時時間: @Session.Timeout
    </div>
</body>
</html>

      顯示結果如下:


     你也可以根據需要將過濾器新增到控制器或者新增到全域性過濾器集合中。若未經登入便直接訪問 http://localhost:38565/Main/index,頁面會跳轉回登入頁面。
     至此,一個簡單的基於窗體驗證的角色訪問控制便完成了。