前幾個文章中介紹了一些關於MVC4.0的東東,今天我們來看一下登陸驗證,也可以說是許可權驗證,即AuthorizeAttribute。這個可以使用在控制器Controller上,也可以使用在Action方法上面,這裡最主要的是要介紹怎樣將自己的許可權驗證進行擴充,以及禁止訪問的頁面轉向問題。
下面我們先看一下代碼,然後在進行分析,那樣就可以事半功倍了,具體代碼如下,當然還可以進行驗證擴充,那就看你的需要了。
1 /// <summary>
2 /// 許可權驗證屬性。
3 /// </summary>
4 public class AuthorizeExAttribute : AuthorizeAttribute
5 {
6 /// <summary>
7 /// 初始化許可權驗證類。
8 /// </summary>
9 /// <param name="permissionName">許可權名稱。</param>
10 public AuthorizeExAttribute(string permissionName = "") {
11 this.PermissionName = permissionName;
12 }
13 /// <summary>
14 /// 擷取許可權名稱。
15 /// </summary>
16 public string PermissionName { get; private set; }
17
18 /// <summary>
19 /// 驗證授權。
20 /// </summary>
21 /// <param name="httpContext">HTTP 上下文,它封裝有關單個 HTTP 請求的所有 HTTP 特定的資訊。</param>
22 /// <returns>如果使用者已經過授權,則為 true;否則為 false。</returns>
23 protected override bool AuthorizeCore(HttpContextBase httpContext)
24 {
25 if(httpContext == null)
26 return false;
27 if(httpContext.User.Identity.IsAuthenticated)
28 {
29 var user = Users.Current;
30 if(!user.IsAnonymous && IsAllow(user) && base.AuthorizeCore(httpContext))
31 return true;
32 }
33 httpContext.Response.StatusCode = 403;
34 return false;
35 }
36
37 private bool IsAllow(User user)
38 {
39 //寫上驗證代碼
40 return true;
41 }
42
43 /// <summary>
44 /// 重寫驗證。
45 /// </summary>
46 /// <param name="filterContext">驗證資訊上下文。</param>
47 public override void OnAuthorization(AuthorizationContext filterContext)
48 {
49 base.OnAuthorization(filterContext);
50 if(filterContext.HttpContext.Response.StatusCode == 403)
51 {
52 if(filterContext.HttpContext.User.Identity.IsAuthenticated)
53 filterContext.Result = new RedirectResult("/AccessError");
54 else
55 filterContext.Result = new RedirectResult(FormsAuthentication.LoginUrl + "?returnUrl=" + filterContext.HttpContext.Request.UrlReferrer);
56 }
57 }
58 }
其中User是本人定義的一個使用者實體類,而Users是這個實體類的方法類,這裡就補貼出代碼,可以自己實現下,因為各個的應用不同。知道了這個許可權驗證的許可權名稱,可以通過它來擷取許可權的值,那樣就可以驗證目前使用者的這個許可權是否通過驗證。只需要重寫他的代碼,就可以實現驗證了,為了能夠告訴前端使用者,提示禁止訪問資訊,這裡設定了一個頁面就是AccessError頁面。
當然返回的頁面也有不一樣的,加入是匿名使用者就需要讓他登入,所以轉向到登入頁面,而如果是登入的使用者就轉向到禁止訪問提示頁面。這隻是開發中需要驗證的一個過濾器,在ASP.NET MVC開發中會使用到。
ASP.NET MVC 4.0改進:
筆者發現在MVC4.0後,微軟加了一個AllowAnoumous的過濾器驗證,即允許匿名使用者存取,方法上的過濾器可以覆蓋掉控制器上的標記。這樣做有一個好處,因為很多地方都是需要登入後才可以訪問的,但是像登入頁面,註冊頁面這些又不需要登入。但是往往都會放在Account控制器中,這樣可以方便驗證。 由於要上班這裡就不多說了,希望能夠學到點東西,同時也給他人...