Community Server專題十:MemberRole之RoleMana
系統
2019-08-12 01:33:43
1891 0
?
Community Server
專題十:
MemberRole
之
RoleManager
由于最近忙于一些瑣事,近半個月都沒有寫新的專題,今天忙里抽閑趕緊補上,實在是抱歉。
?
設計做多了就會發現,用戶權限管理是一個永恒的話題,幾乎沒有什么項目不需要權限和角色管理的,可能會無數次去寫角色管理的代碼,而且會根據項目的不同粒度也會有所不同。在
CS
中,采用了
MemberRole.dll
中的
RoleManager
進行角色管理,該角色管理機制同樣在
asp.net 2.0 beta2
中得到應用。在分析代碼之前先看看數據庫中的角色的關系表:
表分兩種前綴,一種是“
aspnet_
”另一種是“
cs_
”,“
aspnet_
”是采用
MemberRole.dll
組件所必需的一些表,包括過程和視圖等都是這樣命名的,在
asp.net 2.0 beta2
中你也可以看到同樣的表、視圖與儲存過程。“
cs_
”前綴是
CS
系統需要的表,由此可以看到
MemberRole.dll
中的
RoleManager
只管理到角色級別,通常我們還會給角色添加一些權限,然后在應用系統中判斷角色擁有的權限從而決定用戶是否有訪問的權限,當然一個用戶可以有多個角色,一個角色又可以有多個權限。有時你設計的某些系統是不需要做如此多權限管理的,只要多個角色就可以解決問題,那么就不再需要擴展數據庫,直接使用
MemberRole.dll
中的
RoleManager
就可以了。
注意:你可能會對
cs_SectionPermissions
、
cs_ProductPermissions
表產生疑惑,這里有兩個權限表,分別管理兩種權限,
cs_SectionPermissions
中存儲節點級別的權限,如
Blog
中,是否有權限開通
blog
,管理所有
blog
等,這些權限就放在
cs_SectionPermissions
,但是對于每個
blog
,如我的
blog
,現在不想要某個用戶訪問,或者需要某個用戶幫忙管理,再或者某個地方某些用戶可以訪問,某些不行,這樣的權限就放入
cs_ProductPermissions
中設置。
RoleManager
是一個
HttpModule
,由此可以在
web.config
中看到如下的配置文件:
?
<
add?
name
="RoleManager"
?type
="Microsoft.ScalableHosting.Security.RoleManagerModule,?MemberRole,?Version=1.0.0.0,?Culture=neutral,?PublicKeyToken=b7c773fb104e7562"
?
/>
?
這也是
RoleManager
角色管理的入口點,同時,在
RoleManager
中實現了
IConfigurationSectionHandler
接口,用來讀取
Web.config
中的以下配置:
????????
<
roleManager?
??????????????
cacheRolesInCookie
="true"
?cookieName
=".CSRoles"
?cookieTimeout
="90"
??????????????cookiePath
="/"
??cookieRequireSSL
="false"
?cookieSlidingExpiration
="true"
?
??????????????createPersistentCookie
="true"
?cookieProtection
="All"
?maxCachedResults
="1000"
?
>
??????????????
<
providers
>
???????????????????
<
add
???????????????????????
name
="CommunityServerSqlProvider"
???????????????????????type
="CommunityServer.Components.CSRoleProvider,?CommunityServer.Components"
???????????????????????connectionStringName
="SiteSqlServer"
???????????????????????applicationName
="dev"
???????????????????????description
="Stores?and?retrieves?roles?data?from?the?local?Microsoft?SQL?Server?database"
?
???????????????????
/>
??????????????
</
providers
>
?????
</
roleManager
>
?????
再這里我們又看到了
Provider
模型,其實
asp.net 2.0 beta2
中大量使用了這種數據訪問模型。它的優點我在前面的專題中已經講解過,不理解的朋友可以看我之前的專題。
在
RoleManager
很重要的一個類就是:
該類繼承至
IPrincipal
,因此我們可以在用戶登錄后通過檢查當前
Context
中
User
的一些方法和屬性,判斷擁護是否擁有某角色。操作的方法在
RoleMangerModule
類下的
OnEnter
下:
OnEnter方法
private
?
void
?OnEnter(
object
?source,?EventArgs?eventArgs)
{
??????
if
?(Roles.Enabled)
??????
{
????????????HttpContext?context1?
=
?((HttpApplication)?source).Context;
????????????
if
?(context1.User?
==
?
null
)
????????????
{
??????????????????context1.User?
=
?
new
?GenericPrincipal(
new
?GenericIdentity(
string
.Empty,?
string
.Empty),?
new
?
string
[
0
]);
????????????}
????????????
if
?(
this
._eventHandler?
!=
?
null
)
????????????
{
??????????????????RoleManagerEventArgs?args1?
=
?
new
?RoleManagerEventArgs(context1);
??????????????????
this
._eventHandler(
this
,?args1);
??????????????????
if
?(args1.RolesPopulated)
??????????????????
{
????????????????????????
return
;
??????????????????}
????????????}
????????????
if
?(Roles.CacheRolesInCookie)
????????????
{
??????????????????
if
?(context1.User.Identity.IsAuthenticated?
&&
?(
!
Roles.CookieRequireSSL?
||
?context1.Request.IsSecureConnection))
??????????????????
{
????????????????????????
try
????????????????????????
{
??????????????????????????????HttpCookie?cookie1?
=
?context1.Request.Cookies[Roles.CookieName];
??????????????????????????????
if
?(cookie1?
!=
?
null
)
??????????????????????????????
{
????????????????????????????????????
string
?text1?
=
?cookie1.Value;
????????????????????????????????????
if
?((text1?
!=
?
null
)?
&&
?(text1.Length?
>
?
0x1000
))
????????????????????????????????????
{
??????????????????????????????????????????Roles.DeleteCookie();
????????????????????????????????????}
????????????????????????????????????
else
????????????????????????????????????
{
??????????????????????????????????????????
if
?(((Roles.CookiePath?
!=
?
null
)?
&&
?(Roles.CookiePath.Length?
>
?
0
))?
&&
?(Roles.CookiePath?
!=
?
"
/
"
))
??????????????????????????????????????????
{
????????????????????????????????????????????????cookie1.Path?
=
?Roles.CookiePath;
??????????????????????????????????????????}
??????????????????????????????????????????cookie1.Domain?
=
?Roles.Domain;
??????????????????????????????????????????context1.User?
=
?
new
?RolePrincipal(context1.User.Identity,?text1);
????????????????????????????????????}
??????????????????????????????}
????????????????????????}
????????????????????????
catch
????????????????????????
{
????????????????????????}
??????????????????}
??????????????????
else
?
if
?(context1.Request.Cookies[Roles.CookieName]?
!=
?
null
)
??????????????????
{
????????????????????????Roles.DeleteCookie();
??????????????????}
????????????}
????????????
if
?(
!
(context1.User?
is
?RolePrincipal))
????????????
{
??????????????????context1.User?
=
?
new
?RolePrincipal(context1.User.Identity);
????????????}
??????}
}
由于知識點比較簡單,
在
MSDN
上也有相關的
IPrincipal
與
Identity
的介紹,我就不細細的分析。
在
RoleManger
里,很多地方使用了
Cookie
,這樣做提高了不少的效率,你想,如果每個用戶每次訪問一個頁面都去讀一次數據庫,把該訪問用戶的權限讀取出來,也許你聰明點,把該用戶的權限先緩存在內存中,并且設置一定的過期時間,其實你還能再聰明一點,那就是把角色保存在客戶端的
Cookie
,這樣連服務器的內存都節約了。只有在用戶第一次登錄,或者清除了
Cookie
等
Cookie
失效的情況下才需要訪問數據庫。但是這也帶來一個問題,就是如果客戶端禁止使用
Cookie
,用戶將無法正常訪問。
CS
中通過在
web.config
中可以配置是否啟用這種機制。
?
到這里,整個
MemberRole.dll
算是粗略的講解了一遍,由于時間上的限制不可能滿足所有讀者的要求,如果有疑問可以
msn
我或者給我留言。后面一些專題我將說說
CS
的頁面,包括
MasterPage
、
Theme
、
Skin
等機制。
Community Server專題十:MemberRole之RoleManager
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】 元
喜歡作者