mvc4 利用filters特性来 实现自己的权限验证 之二
剛開始摸索C# MVC,也只是按圖索驥,對C#的特性不是很懂,耐心看完相關文章,對特性的使用有了進一步理解。
1.特性類的命名規范:特性也是一個類,必須繼承于System.Attribute類,命名規范為“類名”+Attribute。不管是直接還是間接繼承,都會成為一個特性類,特性類的聲明定義了一種可以放置在聲明之上新的特性。
2.特性的使用:[特性類名(不需要后綴Attribute)(公共屬性=值, 公共屬性=值...)]放置于類、方法、字段、屬性、結構體...前修飾。
如:
//在Person類上標記ClassMsg特性 [ClassMsg(Msg = "這是關于人的姓名信息的類")] class Person { //在_name字段上應用ClassMsg特性 [ClassMsg("這是存儲姓名的字段")] string _name; //[ClassMsg("這是讀寫姓名字段的屬性")] public string Name { get { return _name; } set { _name = value; } } }3.特性類的應用限定修飾:
使用AttributeUsage,來控制如何應用新定義的特性,放置于特性類定義前。
[AttributeUsageAttribute(AttributeTargets.All //可以應用到任何元素 ,AllowMultiple=true, //允許應用多次,我們的定值特性能否被重復放在同一個程序實體前多次。 ,Inherited=false,//不繼承到派生 )]4.特性的應用
(1).net中特性用來處理多種問題,比如序列化、程序的安全特性、防止即時編譯器對程序代碼進行優化從而代碼容易調試等等。
定植特性的本質上是一個類的元素上去添加附加信息,并在運行其通過反射得到該附加信息(在使用數據實體對象時經常用到)
(2)Attribute 作為編譯器的指令時的應用
Conditional:起條件編譯的作用,只有滿足條件,才允許編譯器對它的代碼進行編譯。一般在程序調試的時候使用
DllImport: 用來標記費.net的函數,表明該方法在一個外部的DLL中定義。
Obsolete: 這個屬性用來標記當前的方法已經廢棄,不再使用
注:Attribute是一個類,因此DllImport也是一個類,Attribute類是在編譯的時候實例化,而不是像通常那樣在運行時實例化。
CLSCompliant: 保證整個程序集代碼遵守CLS,否則編譯將報錯。
?
昨天寫的《mvc4 利用filters特性來 實現自己的權限驗證》 ?不需要注冊全局的Filters來實現,即第2步不需要。全局的Filter所有的請求都會都會觸發。
修改為:
mvc4 利用特性類過濾,實現自己的權限驗證?
1.新建一個特性類AdminAuthorize繼承ActionFilterAttribute。重寫OnActionExecuting,在執行action前執行,在這里進行權限判斷,在switch可定義多種權限。
代碼:Filters/AdminAuthorizeAttribute.cs
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Web; 6 using System.Web.Mvc; 7 using System.Web.Profile; 8 using System.Web.Routing; 9 using System.Web.Security; 10 namespace XyguiMvcApp.Filters 11 { 12 //限制Attribute類的使用 13 [AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = true)] 14 public class AdminAuthorizeAttribute : ActionFilterAttribute 15 { 16 /// <summary> 17 /// 角色 18 /// </summary> 19 private string role = ""; 20 /// <summary> 21 /// 摘要:獲取或設置用戶角色。 22 // 返回結果:用戶角色。 23 /// </summary> 24 public string Role 25 { 26 get { return role; } 27 set { role = value; } 28 } 29 30 public override void OnActionExecuting(ActionExecutedContext filterContext) 31 { 32 switch (role) 33 { 34 case "Admin": //Admin角色權限檢查。 35 var cookie = System.Web.HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName]; 36 if (cookie != null && FormsAuthentication.Decrypt(cookie.Value).UserData == role) 37 { 38 //驗證通過 39 } 40 else 41 { 42 string returnUrl = HttpContext.Current.Request.Url.PathAndQuery; 43 var url = FormsAuthentication.LoginUrl + "?returnUrl=" + HttpUtility.UrlEncode(returnUrl); 44 //HttpContext.Current.Response.Redirect(url, true);//進入action 45 //filterContext.HttpContext.Response.Redirect(url);//進入action 46 /*filterContext.Result = new RedirectToRouteResult( //不進入action 47 new RouteValueDictionary 48 { 49 { "action", "Login" }, 50 { "controller", "Admin" }, 51 {"returnUrl", returnUrl} 52 });*/ 53 filterContext.Result = new RedirectResult(url);//不進入action,轉到登錄頁面。 54 } 55 56 break; 57 case "Anyone": //任何人。 58 59 break; 60 case "Guest": //Guest權限 61 62 break; 63 default: 64 65 break; 66 67 } 68 69 } 70 } 71 } 查看代碼3.在action前添加特性[AdminAuthorize(Role = "Admin")] ,這里斷點發現只有第一次調用action才實例化AdminAuthorizeAttribute類,而OnActionExecuted每次調用action都會觸發。
如:
1 [AdminAuthorize(Role = "Anyone")] 2 public ActionResult Index() 3 { 4 return View(); 5 } 6 7 [AdminAuthorize(Role = "Admin")] 8 public ActionResult Main() 9 { 10 11 return View(); 12 }?
4.配置web.config
<authentication mode="Forms">
<forms name=".AuthAdmin" loginUrl="~/Admin/Login" timeout="30" protection="All" path="/Admin" defaultUrl="/Admin/Main" />
</authentication>
5.在登錄action,Login注冊船票ticket
1 FormsAuthenticationTicket MyTicket = new FormsAuthenticationTicket2 (3 1,4 admin.UserName+"," + admin.NickName,5 DateTime.Now,6 DateTime.Now.AddMinutes(300),7 true,8 "Admin",9 FormsAuthentication.FormsCookiePath 10 ); 11 12 //添加 Cookies 13 string myHash = FormsAuthentication.Encrypt(MyTicket); 14 HttpCookie myCookie = new HttpCookie(FormsAuthentication.FormsCookieName, myHash); 15 Response.Cookies.Add(myCookie);?
轉載于:https://www.cnblogs.com/xygui/p/5587428.html
總結
以上是生活随笔為你收集整理的mvc4 利用filters特性来 实现自己的权限验证 之二的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis配置问题
- 下一篇: C++ 百炼成钢20