成員和角色管理器提供程序——現在ASPNET 包含了內建的成員和角色管理服務由於這些服務都是提供程序驅動的(providerdriven)你可以輕易地變更它或者用自定義實現來代替它
登錄控件——新的登錄控件為站點的基於認證和授權的UI(例如登錄窗體創建用戶窗體密碼取回已登錄用戶或角色的定制UI)提供了基本模塊這些控件利用ASPNET 中的內建的成員和角色服務與站點所定義的用戶和角色信息交互操作
大多數Web應用程序的一個重要的部分是辨別用戶並控制資源的訪問權檢測請求的實體(entity)身份的操作就是認證(authentication)通常為了進行認證用戶必須提供憑證例如帳號/密碼一旦認證過的身份是有效的就必須檢測該身份是否能夠訪問指定的資源這個過程就是授權(authorization)ASPNET與IIS一起為應用程序提供認證和授權服務
COM對象的一個重要特性就是它能夠控制那些運行COM對象代碼的身份當COM對象用請求的實體身份運行代碼的時候就稱為模仿(impersonation)ASPNET框架組件應用程序可以選擇模仿請求
有些應用程序還希望根據請求的身份或者根據請求的身份所屬的角色來動態地定制內容ASPNET框架組件應用程序可以動態地檢測當前請求的身份是否屬於某種角色例如應用程序可能希望檢測當前用戶是否屬於管理員角色以便為管理員有條件地生成內容
ASPNET 的成員特性使你創建和管理用戶更加容易了成員特性一般與另外一個叫做角色管理器的新特性一起運作角色管理器為創建角色和給角色指定用戶提供了下層結構當成員角色管理器特性和窗體認證一起工作的時候ASPNET 就可以為創建認證和授權用戶提供端對端的支持
成員和角色管理器都是用基於提供程序的模型設計的提供程序從特性所暴露的類和業務邏輯中提取特性的物理數據存儲成員和角色管理器特性都帶有Microsoft SQL Server提供程序成員特性還帶有一個用於處理活動目錄和活動目錄應用程序模式(ADAM)的提供程序角色管理器特性帶有一個能利用Windows Server 授權管理特性的提供程序你可以建立自定義的提供程序並配置它與成員和角色管理器特性一起使用使用自定義提供程序的時候利用成員和角色管理器特性的頁面仍然會繼續工作毫無改變
登錄控件是一組自定義的服務器控件它為認證和授權事務提供了公用的用戶界面登錄控件利用了成員角色管理器和窗體認證特性中的功能
認證和授權
ASPNET與IIS一起支持使用基本的Digest和Windows認證ASPNET支持微軟Passport認證服務它支持單點登錄服務和用戶配置服務ASPNET還支持一種使用基於窗體認證的強大的服務基於窗體的認證使用Cookie來認證用戶並允許應用程序執行自己的憑證驗證過程
我們要認識到ASPNET認證服務是受到IIS提供的認證服務制約的例如為了在IIS應用程序中使用基本認證你就必須使用Internet服務管理工具來配置應用程序以使用基本認證
ASPNET提供了兩種授權服務
◆檢查ACL(訪問控制列表)或資源權限看某個認證過的用戶是否能夠訪問該資源
◆URL授權它批准一個身份使用一定的Web空間
為了演示它們的差別我們來看一個例子假設某個應用程序允許匿名用戶使用IUSR_MYMACHINE帳號訪問當某個ASPNET頁面(例如/defaultaspx)的請求通過認證之後就會依據該文件(例如c\inetpub\wwwroot\defaultaspx)的ACL進行檢查看IUSR_MYMACHINE帳號是否有權限讀取這個文件如果有權限就對訪問進行授權如果Web內容位於NTFS卷中並且已經配置了虛擬目錄使用Windows認證文件的授權就會自動地執行
對於URL授權來說會依據ASPNET應用程序的配置數據來進行檢查如果允許訪問被請求的URL請求就獲得授權了在例子中ASPNET檢查匿名用戶是否有訪問/Defaultaspx的權限(也就是說檢查過程是依據URL本身的沒有依據URL最終解析成的文件)
這種差別看起來很細微但是它讓應用程序能夠使用類似基於窗體的認證或Passport認證在這些認證模式中用戶不需要與計算機或域帳號相對應它還允許你進行虛擬資源的授權(在資源下方並沒有物理文件)例如應用程序可以把所有對stk文件的請求映射給一個處理程序它根據查詢字符串中的變量來進行證券報價在這種情況下沒有物理的stk文件可供ACL檢查因此使用URL授權來控制虛擬資源的訪問權
文件授權通常依賴IIS提供的通過認證的帳號來執行如果允許匿名訪問它就是配置的匿名帳號否則就是NT帳號它的工作方式跟ASP是一樣的
在資源管理器屬性頁面的安全選項卡中可以設置文件或目錄的ACL(訪問控制列表)URL授權被配置為ASPNET框架組件應用程序的一部分在授權用戶和角色部分有完整的講解
為了激活ASPNET的認證服務你必須在應用程序的配置文件中配置<authentication>元素這個元素可以包含下表列舉的任何值
值
描述
None
沒有激活的ASP
NET認證服務
請注意IIS認證服務仍然存在
Windows
ASP
NET認證服務給當前請求附加上WindowsPrincipal (System
Security
Principal
WindowsPrincipal)
以保證根據NT用戶或組進行授權
Forms
ASP
NET認證服務管理cookie並把未認證的用戶重定向到登錄頁面
它通常在IIS允許匿名訪問應用程序的時候使用
Passport
ASP
NET認證服務提供了Passport SDK (你必須安裝)的一個方便的包裝
例如下面的配置文件允許應用程序使用基於窗體(cookie)的認證
<configuration>
<systemweb>
<authentication mode=Forms/>
</systemweb>
</configuration>
使用登錄控件
下面的例子演示了在應用程序中如何使用登錄控件
創建和登錄用戶
在例子中我們會看到站點的主頁它包含了一個LoginStatus控件該控件提示用戶登錄站點這個頁面上的LoginStatus控件檢查用戶當前是否通過了認證並向用戶顯示一個登錄鏈接用戶點擊這個鏈接就可以看到默認的loginaspx頁面在nfig中已經把這個頁面配置為窗體認證Login控件顯示在Loginaspx頁面上(請注意在默認的登錄頁面上登錄控件的VisibleWhenLoggedIn屬性會被忽略)在例子中登錄控件設置了額外的屬性顯示了創建用戶鏈接點擊這個鏈接會訪問另外一個頁面那個頁面使用了CreateUserWizard控件在默認情況下CreateUserWizard控件包含兩個步驟在第一步中用戶輸入必要的信息當他們點擊創建用戶按鈕的時候控件把這些信息傳遞給成員API如果成員API不能建立該用戶在控件中會顯示適當的錯誤信息如果用戶創建成功控件就載入向導的第二步在例子中ContinueDestinationPageUrl屬性被設置為在用戶創建成功之後返回主頁在默認情況下當用戶被成功創建之後CreateUserWizard會認證並登錄用戶當用戶返回到主頁的時候他們會注意到LoginStatus被刪除了他們已經通過了認證並顯示了一個登出鏈接點擊登錄鏈接會引起用戶認證票據(ticket)被清除並顯示登錄鏈接這時用戶可以點擊登錄鏈接由於他們已經創建了用戶帳號所以可以在loginaspx上輸入用戶名和密碼來登錄網站你可能注意到Login控件顯示了一個記住帳號(remember me)檢查框選中這個框並成功登錄之後會向用戶的計算機上寫入一個cookie該cookie默認的存續期是年你可以通過把Login控件的DisplayRememberMe和RememberMeSet屬性設置為false來禁用這個選項查看示例的代碼你可以發現這項事務並沒有任何代碼只設置了少許的幾個屬性這些控件的樣式屬性都是站點應用的樣式表設置的
Loginaspx
<%@ Page Language=VB MasterPageFile=~/Sitemaster%>
<asp:Content ID=Content ContentPlaceHolderId=MainBody runat=server>
<asp:login ID=Login runat=server createuserurl=CreateUseraspx
createusertext=Create a New Account />
</asp:Content>
CreateUseraspx
<%@ Page Language=VB MasterPageFile=~/Sitemaster%>
<asp:Content ID=Content ContentPlaceHolderId=MainBody runat=server>
<asp:CreateUserWizard ID=CreateUserWizard runat=server
continuedestinationpageurl=Homeaspx/><br />
<a >Return to Default Home Page</a><br />
<a >Return to LoginView Home Page</a><br />
<a >Return to ChangePassword Home Page</a><br />
</asp:Content>
向認證用戶顯示不同的內容
下面的例子演示了使用LoginView控件為認證過的用戶和匿名用戶顯示不同的內容盡管例子中沒有顯示什麼但是LoginView控件支持基於用戶角色來顯示不同內容LoginView控件中的AnonymousTemplate模板包含了一個登錄控件LoggedInTemplate模板包含了LoginName控件LoginName控件利用格式化字符串屬性來顯示歡迎和用戶姓名請使用上一個例子中創建的帳號或重新創建一個帳號來登錄站點並點擊頁面上方的登出鏈接
<%@ Page Language=VB MasterPageFile=~/Sitemaster%>
<asp:Content ID=Content ContentPlaceHolderId=MainBody runat=server>
<asp:loginview ID=LoginView runat=server>
<loggedintemplate>
<h>
<asp:loginname id=LoginName runat=server formatstring=Welcome {} />
</h>
</loggedintemplate>
<anonymoustemplate>
<h>Welcome to Login Controls</h>
<asp:login ID=Login runat=server
createuserurl=CreateUseraspx createusertext=Create a New Account />
</anonymoustemplate>
</asp:LoginView>
</asp:Content>
修改密碼
在默認情況下ChangePassword控件要求用戶通過了站點的認證才能更改他們的密碼但是在下面的例子中我們把DisplayUserName屬性設置為真其結果是用戶在改變自己的密碼之前可以由ChangePassword控件進行認證或者通過站點認證的用戶輸入不同的帳號來改變密碼例子還鏈接到了創建用戶頁面使你能夠創建有效的用戶並測試示例
<%@ Page Language=VB MasterPageFile=~/Sitemaster%>
<asp:Content ID=Content ContentPlaceHolderId=MainBody runat=server>
<asp:ChangePassword ID=ChangePassword runat=server
createuserurl=CreateUseraspx createusertext=Create a New Account
canceldestinationpageurl=HomeChangePasswordaspx displayusername=true
continuedestinationpageurl=HomeChangePasswordaspx/>
</asp:Content>
使用成員和角色管理器API
成員特性是圍繞兩個核心類構建的Membership和MembershipUserMembership類提供創建用戶(MembershipUser類處理)的方法以及通用的管理用戶的方法用Membership類建立的用戶是通過ASPNET應用程序認證的身份
Membership類執行的通用事務包括
◆創建新的MembershipUser
◆當用戶試圖登錄的時候驗證用戶名-密碼組合接下來你可以使用窗體認證來生成一個cookie表明用戶登錄了站點
◆ 檢索MembershipUser實例
◆更新MembershipUser實例
◆根據不同的條件搜索用戶
◆獲取當前在線的通過認證的用戶
◆在不需要用戶的時候從系統中刪除它
一旦你獲取了MembershipUser實例就可以直接使用MembershipUser類執行下面的事務
◆訪問應用程序中的MembershipUser類的屬性
◆檢索用戶的密碼(只有把成員特性配置為允許密碼檢索才可以使用)
◆改變或重置用戶的密碼
◆改變用戶的密碼提問和答案(如果成員特性被配置為在檢索或更新密碼之前提示用戶密碼問題和答案)
◆解鎖那些因為密碼錯誤或密碼答案錯誤而被鎖定的用戶
角色管理器
角色管理器的核心類是Roles類Roles為創建角色和把用戶指定給角色提供方法它也提供了用於管理角色信息的方法
使用Roles類可以執行的通用事務包括
◆創建新角色
◆刪除已有的角色
◆把用戶指定給角色
◆從角色中刪除用戶
◆檢測某個用戶是否獲得了特定角色的授權
◆搜索特定角色中的用戶檢索角色中的所有用戶
◆獲取特定用戶的角色信息
角色管理器特性也包含了HttpModule這個模塊負責檢索用戶分配的角色並把這些信息存儲在RolePrincipal內而它存在於頁面的HttpContext中HttpContext中存在RolePrincipal使你能夠利用<authorization>元素來保護頁面和目錄依據RolePrincipal中存儲的角色信息用戶只能獲得站點內特定頁面和目錄的訪問權
示例
下面的例子演示了在應用程序中如何使用成員 API
創建新用戶
下面的例子演示了如何建立新的MembershipUser示例使用了MembershipCreateUser重載它返回一個狀態參數其它的重載也可以使用他們會拋出異常而不是返回狀態代碼請注意在默認情況下成員特性要求密碼至少有個字符長度並且密碼至少包含一個非數字字符
<script runat=server>
Sub btnCreate_Click(ByVal sender As Object ByVal e As SystemEventArgs)
Dim userName As String = txtUserIdText
這個值式加密的或散列過不會顯示
Dim password As String = txtPasswordText
Dim email As String = txtEmailText
Dim passwordQuestion As String = ddlPasswordQuestionSelectedValue
這個值式加密的或散列過不會顯示
Dim passwordAnswer As String = txtPasswordAnswerText
Dim result As MembershipCreateStatus
MembershipCreateUser(userName password email passwordQuestion
passwordAnswer True result)
lblResultsVisible = True
Select Case result
Case MembershipCreateStatusSuccess
txtUserIdText = Nothing
txtPasswordText = Nothing
txtEmailText = Nothing
ddlPasswordQuestionSelectedIndex =
txtPasswordAnswerText = Nothing
lblResultsText = User successfully created!
Case MembershipCreateStatusInvalidUserName
lblResultsText = The username format was invalid Please enter a different username
Case MembershipCreateStatusInvalidPassword
lblResultsText = The password was invalid:
A password cannot be an empty string and must also meet the pasword
strength requirements of the configured provider Please enter a new password
Case MembershipCreateStatusInvalidEmail
lblResultsText = The email format was invalid Please enter a different username
Case MembershipCreateStatusInvalidQuestion
lblResultsText = The password question format was invalid
Please enter a different question
Case MembershipCreateStatusInvalidAnswer
lblResultsText = The password answer format was invalid
Please enter a different answer
Case MembershipCreateStatusDuplicateUsername
lblResultsText = The username is already in use Please enter a new username
Case MembershipCreateStatusDuplicateEmail
lblResultsText = The email address is already in use
Please enter a different email address
Case Else
lblResultsText = An error occurred while creating the user
End Select
End Sub
</script>
用戶登錄和訪問用戶屬性
下面的例子演示了用戶使用MembershipValidateUser方法登錄它還演示了在登錄用戶的時候如何同時使用窗體認證和成員特性在上面的例子中創建用戶之後請在登錄頁面上輸入憑證一旦你登錄了你會被重定向到一個頁面該頁面利用MembershipGetUser來檢索與登錄用戶相對應的MembershipUser實例同時請注意這個頁面還顯示了目錄上設置的用戶屬性這些內容只有通過認證的用戶才能訪問點擊頁面底部的登出鏈接可以退出站點
<script runat=server>
Protected memUser As MembershipUser
Sub Page_Load(ByVal sender As Object ByVal e As SystemEventArgs)
memUser = MembershipGetUser()
End Sub
Sub linkLogout_Click(ByVal sender As Object ByVal e As SystemEventArgs)
FormsAuthenticationSignOut()
RolesDeleteCookie()
FormsAuthenticationRedirectToLoginPage()
End Sub
</script>
User Name/ID: <% = ServerHtmlEncode(memUserUsername) %>
Email:<% = ServerHtmlEncode(memUserEmail) %>
更新用戶屬性
請用前面建立的用戶憑證登錄頁面會用ASPNET 中新的DetailsView控件顯示用戶屬性DetailsView控件與一個數據源控件通訊在例子中ObjectDataSource控件檢索MembershipUser實例的內容你可以點擊頁面底部的編輯鏈接使DetailsView進入編輯模式MembershipUser的電子郵件和注釋都可以修改點擊更新鏈接可以把新值保存到數據庫請注意在代碼中頁面實現了ItemUpdating事件該事件是由ObjectDataSource引發的這樣做是必要的MembershipUser類沒有參數化構造函數它要求使用ObjectDataSource的雙向數據綁定點擊登出鏈接可以退出
Sub DetailsView_ItemUpdating(ByVal sender As Object
ByVal e as DetailsViewUpdateEventArgs)
必須手動處理更新操作因為MembershipUser 沒有參數化的構造函數
Dim memUser as MembershipUser = MembershipGetUser()
memUserEmail = CStr(eNewValues())
memUserComment = CStr(eNewValues())
Try
MembershipUpdateUser(memUser)
eCancel = true
DetailsViewChangeMode(DetailsViewModeReadOnly)
Catch ex as Exception
ResponseWrite(<div>The following error occurred:<font color=red>
+ exMessage + </font></div>)
eCancel = true
End Try
End Sub
帳號鎖定
Membership特性自動地跟蹤用戶重試密碼的次數在檢索密碼或重置密碼的時候它也跟蹤密碼重試的次數下面的例子演示了自動的帳號鎖定能力以及如何取消帳號鎖定首先使用前面的建立新用戶示例創建一個新帳號接著點擊下方的按鈕運行帳號登出示例登錄頁面顯示了顯示了為了鎖定帳號需要重試的失敗次數在登錄頁面上使用你建立的第一個帳號並輸入錯誤的密碼請注意在重試的失敗次數到了之後如果你使用了正確的密碼也不能登錄了這是因為在重試失敗的次數到了一定的數量之後Membership特性自動地鎖定的帳號為了解除該帳號的鎖定請使用你建立的第二個帳號登錄顯示的頁面與前面的顯示用戶屬性的例子很相似但是這個頁面允許你在頁面底部輸入任意的用戶名稱請輸入被鎖定的帳號並回車DetailsView控件會刷新並顯示該用戶的信息請注意標識鎖定狀態的檢查框IsLockedOut是選中的LastLockoutDate也被更新了它顯示了用戶被鎖定的日期點擊頁面底部的解鎖按鈕來解除當前顯示的用戶的鎖它調用了MembershipUser實例的UnlockUser方法解除了用戶的鎖在解除用戶的鎖之後IsLockedOut檢查框被清除了LastLockoutDate屬性也被重置了點擊頁面底部的登出鏈接現在嘗試用第一個帳號登錄現在可以再次成功登錄了
Sub btnUnlockUser_Click(ByVal sender As Object ByVal e As SystemEventArgs)
Dim memUser as MembershipUser = MembershipGetUser(txtUserNameText)
If (Not memUser is Nothing And memUserIsLockedOut = true)
memUserUnlockUser()
End If
刷新被選中用戶的信息
DetailsViewDataBind()
End Sub
刪除用戶
你可以使用MembershipDeleteUser方法刪除用戶下面的例子演示了如何使用窗體認證刪除當前登錄的用戶並讓該用戶登出
<script runat=server>
Sub btnDeleteCurrentUser_Click(ByVal sender As Object ByVal e As SystemEventArgs)
If (MembershipDeleteUser(UserIdentityName)) Then
FormsAuthenticationSignOut()
RolesDeleteCookie()
ResponseRedirect(~/CreatingUsersaspx)
Else
lblResultVisible = True
lblResultText = The Membership user was not deleted
End If
End Sub
</script>
管理角色
下面的例子演示了認證用戶如何使用角色管理器特性所有的示例頁面都拒絕匿名用戶訪問在默認情況下ASPNET中是沒有激活角色管理器特性的但是下面的例子中使用的nfig顯式地激活了角色管理器特性
添加和刪除角色
下面的例子演示了如何使用RolesCreateRole和RolesDeleteRole方法建立和刪除角色在你建立角色或刪除已有角色之後頁面使用RolesGetAllRoles方法顯示系統中的所有可用角色RolesGetAllRoles的返回值可以輕易地綁定到任何支持數據綁定的控件你至少需要建立一個叫做Administrators的角色
在你建立和刪除角色的時候請注意角色管理器特性不允許你建立重復的角色同時還要注意在默認情況下角色管理器不允許你刪除填充過的角色
Sub btnCreateRole_Click(ByVal sender As Object ByVal e As SystemEventArgs)
Dim roleName As String = txtCreateRoleText
Try
RolesCreateRole(roleName)
lblResultsText = Nothing
lblResultsVisible = False
txtCreateRoleText = Nothing
Catch ex As Exception
lblResultsText = Could not create the role: + ServerHtmlEncode(exMessage)
lblResultsVisible = True
End Try
End Sub
Sub btnDeleteRole_Click(ByVal sender As Object ByVal e As SystemEventArgs)
If (lbxAvailableRolesSelectedIndex <> ) Then
Try
RolesDeleteRole(lbxAvailableRolesSelectedValue)
lblResultsText = Nothing
lblResultsVisible = False
Catch ex As Exception
lblResultsText = Could not delete the role: + ServerHtmlEncode(exMessage)
lblResultsVisible = True
End Try
End If
End Sub
向角色中添加用戶和從角色中刪除用戶
下面的例子使用了前面例子中建立的角色它演示了如何向角色添加用戶和從角色中刪除用戶使用RolesAddUserToRole方法向角色中添加用戶使用RolesRemoveUserFromRole方法從角色中刪除用戶在給角色添加用戶之前先檢查該用戶是否已經是該角色的成員這種檢查是必要的因為如果你試圖給角色多次添加同一個用戶角色管理器會拋出異常在前面的例子中角色信息和角色的成員都顯示在數據綁定控件中用戶所屬的角色列表通過RolesGetRolesForUser方法獲取要運行下面的例子就要確保把你自己加入Administrators角色
Sub btnAddUserToRole_Click(ByVal sender As Object ByVal e As SystemEventArgs)
If (lbxAvailableRolesSelectedIndex <> ) Then
Dim selectedRole As String = lbxAvailableRolesSelectedValue
If Not RolesIsUserInRole(selectedRole) Then
Try
RolesAddUserToRole(UserIdentityName selectedRole)
RefreshCurrentRolesListBox()
Catch ex As Exception
lblResultsText = Could not add the user to the role: +
ServerHtmlEncode(exMessage)
lblResultsVisible = True
End Try
Else
lbxAvailableRolesSelectedIndex =
End If
End If
End Sub
Sub btnDeleteUserFromRole_Click(ByVal sender As Object ByVal e As SystemEventArgs)
Dim selectedRole As String = lbxUserRolesSelectedValue
If (lbxUserRolesSelectedIndex <> ) Then
Try
RolesRemoveUserFromRole(UserIdentityName selectedRole)
RefreshCurrentRolesListBox()
Catch ex As Exception
lblResultsText = Could not remove the user from the role: +
ServerHtmlEncode(exMessage)
lblResultsVisible = True
End Try
End If
End Sub
管理角色
下面的例子演示了認證用戶如何使用角色管理器特性所有的示例頁面都拒絕匿名用戶訪問在默認情況下ASPNET中是沒有激活角色管理器特性的但是下面的例子中使用的nfig顯式地激活了角色管理器特性
添加和刪除角色
下面的例子演示了如何使用RolesCreateRole和RolesDeleteRole方法建立和刪除角色在你建立角色或刪除已有角色之後頁面使用RolesGetAllRoles方法顯示系統中的所有可用角色RolesGetAllRoles的返回值可以輕易地綁定到任何支持數據綁定的控件你至少需要建立一個叫做Administrators的角色
在你建立和刪除角色的時候請注意角色管理器特性不允許你建立重復的角色同時還要注意在默認情況下角色管理器不允許你刪除填充過的角色
Sub btnCreateRole_Click(ByVal sender As Object ByVal e As SystemEventArgs)
Dim roleName As String = txtCreateRoleText
Try
RolesCreateRole(roleName)
lblResultsText = Nothing
lblResultsVisible = False
txtCreateRoleText = Nothing
Catch ex As Exception
lblResultsText = Could not create the role: + ServerHtmlEncode(exMessage)
lblResultsVisible = True
End Try
End Sub
Sub btnDeleteRole_Click(ByVal sender As Object ByVal e As SystemEventArgs)
If (lbxAvailableRolesSelectedIndex <> ) Then
Try
RolesDeleteRole(lbxAvailableRolesSelectedValue)
lblResultsText = Nothing
lblResultsVisible = False
Catch ex As Exception
lblResultsText = Could not delete the role: + ServerHtmlEncode(exMessage)
lblResultsVisible = True
End Try
End If
End Sub
向角色中添加用戶和從角色中刪除用戶
下面的例子使用了前面例子中建立的角色它演示了如何向角色添加用戶和從角色中刪除用戶使用RolesAddUserToRole方法向角色中添加用戶使用RolesRemoveUserFromRole方法從角色中刪除用戶在給角色添加用戶之前先檢查該用戶是否已經是該角色的成員這種檢查是必要的因為如果你試圖給角色多次添加同一個用戶角色管理器會拋出異常在前面的例子中角色信息和角色的成員都顯示在數據綁定控件中用戶所屬的角色列表通過RolesGetRolesForUser方法獲取要運行下面的例子就要確保把你自己加入Administrators角色
Sub btnAddUserToRole_Click(ByVal sender As Object ByVal e As SystemEventArgs)
If (lbxAvailableRolesSelectedIndex <> ) Then
Dim selectedRole As String = lbxAvailableRolesSelectedValue
If Not RolesIsUserInRole(selectedRole) Then
Try
RolesAddUserToRole(UserIdentityName selectedRole)
RefreshCurrentRolesListBox()
Catch ex As Exception
lblResultsText = Could not add the user to the role: + ServerHtmlEncode(exMessage)
lblResultsVisible = True
End Try
Else
lbxAvailableRolesSelectedIndex =
End If
End If
End Sub
Sub btnDeleteUserFromRole_Click(ByVal sender As Object ByVal e As SystemEventArgs)
Dim selectedRole As String = lbxUserRolesSelectedValue
If (lbxUserRolesSelectedIndex <> ) Then
Try
RolesRemoveUserFromRole(UserIdentityName selectedRole)
RefreshCurrentRolesListBox()
Catch ex As Exception
lblResultsText = Could not remove the user from the role: +
ServerHtmlEncode(exMessage)
lblResultsVisible = True
End Try
End If
End Sub
用角色管理器對頁面進行授權訪問
這個例子的nfig文件包含了<authorization>元素它限制了示例只能讓Administrators角色的成員訪問請確保你已經建立了Administrators角色並把自己添加到了這個角色中一旦你稱為Administrators角色的成員就可以訪問示例頁面了ASPNET提供了一個角色管理器HttpModule它自動地把RolePrincipal附加到當前請求的HttpContext上如果你是Administrators角色的成員當URL授權過程根據RolePrincipal執行IsInRole檢查(URL授權過程調用RolePrincipalIsInRole)的時候該訪問檢查會返回true你就可以訪問頁面了請注意你可以通過調用PageUser並把結果轉換RolePrincipal來引用頁面中的RolePrincipal
<location path=administrators_role>
<systemweb>
<authorization>
<allow roles=Administrators />
<deny users=*/>
</authorization>
</systemweb>
</location>
編程檢查授權
由於角色管理器特性把RolePrincipal附加到HttpContext上你也可以編寫代碼根據RolePrincipal執行訪問檢查你先建立兩個角色Regular Users和Power Users把自己添加到這兩個角色中當你運行示例的時候頁面使用多種技術執行IsInRole檢查有些訪問檢查使用了UserIsInRole它說明了使用正常的PageUser語法的時候RolePrincipal也是可用的這個頁面還演示了如何把PageUser轉換為RolePrincipal引用接著直接在RolePrincipal上調用IsInRole
<asp:Label ID=Label runat=server Text=<%# UserIsInRole(Administrators) %> />
<asp:Label ID=Label runat=server Text=<%# RolesIsUserInRole(Regular Users) %> />
<asp:Label ID=Label runat=server Text=<%#
(CType(UserRolePrincipal))IsInRole(Power Users) %> />
From:http://tw.wingwit.com/Article/program/net/201311/13746.html