1. 程式人生 > >關於ASP.NET MVC的權限認證的一些總結

關於ASP.NET MVC的權限認證的一些總結

filter mode allow 檢查 art 權限 奇怪 dha 可執行

最近在學ASP.NET MVC的權限認證的一些東西,上網搜索了一陣,發現網上的方法大多數是以下幾類:

一、FormsAuthentication.SetAuthCookie(admin.Name, false)或者是FormsAuthenticationTicket

感受:感覺FormsAuthentication.SetAuthCookie這種方法重在檢查是否有用戶登錄等,需要檢查權限時,要調用this.User.Identity.IsAuthenticated方法來檢查是否授權等,每次要檢查權限時,都要進行權限檢查,這類檢查對於asp頁面挺適用的,但是也挺麻煩的,還要配合web.config使用,我在網上看視頻講到這一塊時,就覺得挺麻煩的,然後他又講了可以用[Authorize]特性來代替這種麻煩的寫法,於是我也嘗試這樣做,奇怪的是我直接加[Authorize]屬性的時候,就算我登錄了,它也是直接給我過濾掉了,並且是回到了Account/Login.aspx頁面,這是我開始最不能理解的地方,因為我在web.config文件中配置了出錯應該回到Home/Index.aspx頁面啊,後來我想起MVC5中微軟給帶的自己的一套登錄頁面,並且在App_Start.cs文件夾Startup.Auth.cs文件中就將 LoginPath = new PathString("/Account/Login")給規定了,於是我將其改為自己的頁面LoginPath = new PathString("/Home/Index"),雖然驗證還是不同過,但是已經可以跳轉回我自己的頁面了,我就想是不是這個Startup.Auth.cs的設置比web.config文件中的設置高呢?我故意將web.config中驗證權限不通過時地址與Startup.Auth.cs文件中設置的跳轉地址不一致,但是運行我發現當權限不通過時,程序執行的依然是Startup.Auth.cs文件中的配置,我仔細查看了一下web.config文件,發現

<system.webServer>
<modules>
<remove name="FormsAuthentication" />
<remove name="ApplicationInsightsWebTracking" />
<add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" />
</modules>
<validation validateIntegratedModeConfiguration="false" />
</system.webServer>

有這麽一句,這意思是將配置文件中的Form驗證給刪除了嗎?我將詞句刪除,然後重新嘗試,發現程序執行了web.config文件配置的跳轉信息。

   驗證不通過時跳轉問題解決了,那麽我直接放上去權限認證[authorize]屬性運行程序,發現我明明已經登陸了,可執行該方法時,還是給我跳轉回了登錄頁面,我又仔細看了一下這個[authorize]屬性,發現它也是檢查cookie信息的,想要讓它有值必須得在驗證前,使用FormsAuthentication.SetAuthCookie(admin.Name, false)或者是FormsAuthenticationTicket對cookie進行設置保存才行,然後看視頻源代碼中做到這一步已經可以正常運行了,我的還得在web.config中添加

<system.web>
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="1"/>
</authentication>
<authorization>
<allow users="*"/>
</authorization>

</system.web>

至於為什麽,我以後再研究研究。

網上說FormsAuthenticationTicket可以對角色權限進行驗證,我看了幾篇帖子,寫的都比較詳細,抽機會得好好用用。

http://www.cnblogs.com/zhwl/archive/2011/02/23/1961924.html

http://www.cnblogs.com/colder/p/4544031.html

二、是重寫繼承於類AuthorizeAttribute的OnAuthorization和OnAuthorizeCore方法

三、重寫OnAuthorizeCore和其對應的HandleUnauthorizedRequest方法的

感受:之前感覺直接在OnAuthorization中驗證權限也可以啊,為什麽非要在OnAuthorizeCore驗證權限呢,在研究了一番之後感覺兩者還是有分工的,執行OnAuthorization方法時,執行base.OnAuthorization(filterContext)這一句時,會調用OnAuthorizeCore,所以大概明白了,OnAuthorizeCore就是用來驗證角色權限的,而OnAuthorization就是來處理權限驗證邏輯的,比如通過驗證怎麽樣, 不通過驗證怎麽樣等等。但是又有一種說法是HandleUnauthorizedRequest方法才是處理OnAuthorizeCore中權限不通過的處理方法的啊,那麽究竟是怎麽樣的呢,容我仔細研究一下再來!

http://www.cnblogs.com/wangjq/archive/2011/03/08/1977092.html

http://www.cnblogs.com/jyan/archive/2012/07/24/2606646.html

http://www.cnblogs.com/yushuo/p/4538031.html

後記:關於第二種和第三種方法,搞得也是迷迷糊糊,找時間還得親自驗證驗證,研究研究,畢竟紙上得來終覺淺,須知此事要躬行啊!

關於ASP.NET MVC的權限認證的一些總結