前言:大家是否在用Forms驗證的時候,常常被很多的概念攪混?是否真的明白什麼是Principal,Identity,以及IPrincipan...?很多的文獻很少提及這些到底是什麼,僅僅是怎麼用,結果出問題,導致很多的朋友的理解僅僅停在表面,使用起來也是束手束腳。相信看完本篇,會有一定的收獲的。
ASP.NET安全架構為實現Web應用程序的安全模式提供了對象模型。不管我們選擇哪一種的身份驗證模式,其中很多的要素是相同的。登錄到應用程序的用戶按照他們提供的憑證被授予Principal和Identity。其中Principal對象表示的是用戶的當前的安全上下文,包括用戶的標識和他們所屬的角色。Identity對象表示的是當前用戶。Principal對象是利用Identity對象(表示用戶的標識)創建的,而且它添加一些額外的信息,比如角色或者自定義的數據。
簡言之:Principal=Identity+角色+自定義數據
大家要注意一點:身份驗證是發生在ASP.NET運行的特定的時期的,記住這一點,具體的以後會講的。 下面我們具體的談:
一 表示安全的上下文
Identity對象表示的是通過身份驗證的用戶。Identity對象的類型取決於所使用的身份驗證,如,Windows身份驗證使用的是 WindowsIdentity對象,而Froms驗證使用的是FormsIdentity對象。
大家開始接觸Identity概念有點難受,其實說白了Identity就是一個用戶的標識,標識是什麼?就是標明用戶是什麼,用戶名字是什麼而已,只是我們這裡說的比較專業一點點而已。
另外,Principal對象表示的是通過身份驗證的用戶的組或者角色的成員:也就當前用戶安全上下文。說安全上下文,說白點就是這個對象包含很多的用戶身份的一些信息。Principal對象是有IIS中的Windows 身份驗證自動的創建的,但是我們也可以創建普通的Principal對象(大家後面就慢慢明白的).
大家在編程的時候,或多或少用過HttpContent.Currrent.User屬性,其實它表示的就是一個Principal對象.Principal對象是實現了IPrincipal接口的。
IPrincipal 接口
不同的身份驗證模式對安全的上下文有不同的要求。我們可以利用Principal對象表示當前的安全上下文。IPrincipal接口定義了Principal對象的基本功能。而且我們還可以自定義安全的上下文對象,只要實現System.Security.Principal接口:
Identity屬性--可以獲取當前Principal對象的Identity.之前說過:Principal包含Identity就是這個原因。
IsInRole(string roleName)方法--可以判斷當前的Principal對象是否屬於指定的角色。大家在變成時候也用過類似的HttpContent.Current.User.Identity.IsInRole("Admin")語句。
Principal對象可以通過HttpContent.Current.User屬性訪問到,下面的代碼大家應該都用過的:
if(HttpContext.Current.User.Identity.IsAuthenticated)
{
lblUserName.Text=HttpContext.Current.User.Identity.Name+"已經登錄";
}
(注:Identity是用戶的標識,包含用戶名。我們後面會講的)
下面的代碼就更加的常見了:判斷當前的用戶是否是管理員角色
if(HttpContext.Current.User.IsInRole("Admin")
{
//
}