ASP.NET 2.0中保證應用程式的安全

來源:互聯網
上載者:User
asp.net|安全|程式

  成員和角色管理器提供者--現在ASP.NET 2.0包含了內建的成員和角色管理服務。由於這些服務都是提供者驅動的(provider-driven),你可以輕易地變更它,或者用自訂實現來代替它。

  登入控制項--新的登入控制項為網站的基於認證和授權的UI(例如登入表單、建立使用者表單、密碼取回、已登入使用者或角色的定製UI)提供了基本模組。這些控制項利用ASP.NET 2.0中的內建的成員和角色服務與網站所定義的使用者和角色資訊互動操作。

  大多數Web應用程式的一個重要的部分是辨別使用者並控制資源的訪問權。檢測請求的實體(entity)身份的操作就是認證(authentication)。通常,為了進行認證,使用者必須提供憑證,例如帳號/密碼。一旦認證過的身份是有效,就必須檢測該身份是否能夠訪問指定的資源,這個過程就是授權(authorization)。ASP.NET與IIS一起為應用程式提供認證和授權服務。

  COM對象的一個重要特性就是,它能夠控制那些運行COM對象代碼的身份。當COM對象用請求的實體身份運行代碼的時候,就稱為模仿(impersonation)。ASP.NET架構組件應用程式可以選擇模仿請求。

  有些應用程式還希望根據請求的身份或者根據請求的身份所屬的角色來動態地定製內容。ASP.NET架構組件應用程式可以動態地檢測當前請求的身份是否屬於某種角色。例如,應用程式可能希望檢測目前使用者是否屬於管理員角色,以便為管理員有條件地產生內容。

  ASP.NET 2.0的成員特性使你建立和系統管理使用者更加容易了。成員特性一般與另外一個叫做角色管理器的新特性一起運作。角色管理器為建立角色和給角色指定使用者提供了下層結構。當成員、角色管理器特性和表單認證一起工作的時候,ASP.NET 2.0就可以為建立、認證和授權使用者提供端對端的支援。

  成員和角色管理器都是用基於提供者的模型設計的。提供者從特性所暴露的類和商務邏輯中提取特性的物理資料存放區。成員和角色管理器特性都帶有Microsoft SQL Server提供者。成員特性還帶有一個用於處理活動目錄和活動目錄應用程式模式(ADAM)的提供者。角色管理器特性帶有一個能利用Windows Server 2003授權管理特性的提供者。你可以建立自訂的提供者,並配置它與成員和角色管理器特性一起使用。使用自訂提供者的時候,利用成員和角色管理器特性的頁面仍然會繼續工作,毫無改變。

  登入控制項是一組自訂的伺服器控制項,它為認證和授權事務提供了公用的使用者介面。登入控制項利用了成員、角色管理器和表單認證特性中的功能。

  認證和授權

  ASP.NET與IIS一起支援使用基本的、Digest和Windows認證。ASP.NET支援微軟Passport認證服務,它支援單點登入服務和使用者佈建服務。ASP.NET還支援一種使用基於表單認證的強大的服務。基於表單的認證使用Cookie來認證使用者,並允許應用程式執行自己的憑證驗證過程。
我們要認識到,ASP.NET認證服務是受到IIS提供的認證服務制約的。例如,為了在IIS應用程式中使用基本認證,你就必須使用Internet服務管理工具來配置應用程式以使用基本認證。

  ASP.NET提供了兩種授權服務:

  · 檢查ACL(存取控制清單)或資源許可權,看某個認證過的使用者是否能夠訪問該資源。

  · URL授權,它批准一個身份使用一定的Web空間。

  為了示範它們的差別,我們來看一個例子,假設某個應用程式允許匿名使用者使用IUSR_MYMACHINE帳號訪問。當某個ASP.NET頁面(例如"/default.aspx")的請求通過認證之後,就會依據該檔案(例如"c:\inetpub\wwwroot\default.aspx")的ACL進行檢查,看IUSR_MYMACHINE帳號是否有許可權讀取這個檔案。如果有許可權,就對訪問進行授權。如果Web內容位於NTFS卷中,並且已經配置了虛擬目錄使用Windows認證,檔案的授權就會自動地執行。

  對於URL授權來說,會依據ASP.NET應用程式的配置資料來進行檢查。如果允許訪問被請求的URL,請求就獲得授權了。在例子中,ASP.NET檢查匿名使用者是否有訪問/Default.aspx的許可權(也就是說,檢查過程是依據URL本身的,沒有依據URL最終解析成的檔案)。

  這種差別看起來很細微,但是它讓應用程式能夠使用類似基於表單的認證或Passport認證,在這些認證模式中使用者不需要與電腦或域帳號相對應。它還允許你進行虛擬資源的授權(在資源下方並沒有物理檔案)。例如,應用程式可以把所有對.stk檔案的請求映射給一個處理常式,它根據查詢字串中的變數來進行證券報價。在這種情況下,沒有物理的.stk檔案可供ACL檢查,因此使用URL授權來控制虛擬資源的訪問權。

  檔案授權通常依賴IIS提供的通過認證的帳號來執行。如果允許匿名訪問,它就是配置的匿名帳號。否則,就是NT帳號。它的工作方式跟ASP是一樣的。

  在資源管理員屬性頁面的"安全"選項卡中可以設定檔案或目錄的ACL(存取控制清單)。URL授權被配置為ASP.NET架構組件應用程式的一部分,在"授權使用者和角色"部分有完整的講解。

  為了啟用ASP.NET的認證服務,你必須在應用程式的設定檔中配置<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>
<system.web>
<authentication mode="Forms"/>
</system.web>
</configuration>

  使用登入控制項

  下面的例子示範了在應用程式中如何使用登入控制項。

  建立和登入使用者

  在例子中我們會看到網站的首頁,它包含了一個LoginStatus控制項,該控制項提示使用者登入網站。這個頁面上的LoginStatus控制項檢查使用者當前是否通過了認證,並向使用者顯示一個登入連結。使用者點擊這個連結就可以看到預設的login.aspx頁面,在web.config中已經把這個頁面配置為表單認證。Login控制項顯示在Login.aspx頁面上(請注意,在預設的登入頁面上登入控制項的VisibleWhenLoggedIn屬性會被忽略)。在例子中,登入控制項設定了額外的屬性,顯示了"建立使用者"連結,點擊這個連結會訪問另外一個頁面,那個頁面使用了CreateUserWizard控制項。在預設情況下,CreateUserWizard控制項包含兩個步驟,在第一步中使用者輸入必要的資訊,當他們點擊"建立使用者"按鈕的時候,控制項把這些資訊傳遞給成員API。如果成員API不能建立該使用者,在控制項中會顯示適當的錯誤資訊;如果使用者建立成功,控制項就載入嚮導的第二步。在例子中,ContinueDestinationPageUrl屬性被設定為在使用者建立成功之後返回首頁。在預設情況下,當使用者被成功建立之後,CreateUserWizard會認證並登入使用者。當使用者返回到首頁的時候,他們會注意到LoginStatus被刪除了,他們已經通過了認證,並顯示了一個登出連結。點擊登入連結會引起使用者認證票據(ticket)被清除,並顯示登入連結。這時使用者可以點擊登入連結,由於他們已經建立了使用者帳號,所以可以在login.aspx上輸入使用者名稱和密碼來登入網站。你可能注意到Login控制項顯示了一個"記住帳號(remember me)"檢查框。選中這個框並成功登入之後,會向使用者的電腦上寫入一個cookie,該cookie預設的存續期是50年。你可以通過把Login控制項的DisplayRememberMe和RememberMeSet屬性設定為false來禁用這個選項。查看樣本的代碼,你可以發現這項事務並沒有任何代碼,只設定了少許的幾個屬性。這些控制項的樣式屬性都是網站應用的樣式表設定的。

Login.aspx
<%@ Page Language="VB" MasterPageFile="~/Site.master"%>
<asp:Content ID="Content1" ContentPlaceHolderId="MainBody" runat="server">
<asp:login ID="Login1" runat="server" createuserurl="CreateUser.aspx" createusertext="Create a New Account" />
</asp:Content>

CreateUser.aspx
<%@ Page Language="VB" MasterPageFile="~/Site.master"%>
<asp:Content ID="Content1" ContentPlaceHolderId="MainBody" runat="server">
<asp:CreateUserWizard ID="CreateUserWizard1" runat="server" continuedestinationpageurl="Home.aspx"/><br />
<a href="Home.aspx">Return to Default Home Page</a><br />
<a href="HomeLoginView.aspx">Return to LoginView Home Page</a><br />
<a href="HomeChangePassword.aspx">Return to ChangePassword Home Page</a><br />
</asp:Content>
  向認證使用者顯示不同的內容

  下面的例子示範了使用LoginView控制項為認證過的使用者和匿名使用者顯示不同的內容。儘管例子中沒有顯示什麼,但是LoginView控制項支援基於使用者角色來顯示不同內容。LoginView控制項中的AnonymousTemplate模板包含了一個登入控制項,LoggedInTemplate模板包含了LoginName控制項。LoginName控制項利用格式化字串屬性來顯示歡迎和使用者姓名。請使用上一個例子中建立的帳號或重新建立一個帳號來登入網站,並點擊頁面上方的登出連結。

<%@ Page Language="VB" MasterPageFile="~/Site.master"%>

<asp:Content ID="Content1" ContentPlaceHolderId="MainBody" runat="server">
<asp:loginview ID="LoginView1" runat="server">
<loggedintemplate>
<h1>
<asp:loginname id="LoginName1" runat="server" formatstring="Welcome {0}" />
</h1>
</loggedintemplate>
<anonymoustemplate>
<h1>Welcome to Login Controls</h1>
<asp:login ID="Login1" runat="server" createuserurl="CreateUser.aspx" createusertext="Create a New Account" />
</anonymoustemplate>
</asp:LoginView>
</asp:Content>
  修改密碼

  在預設情況下,ChangePassword控制項要求使用者通過了網站的認證才能更改他們的密碼。但是,在下面的例子中,我們把DisplayUserName屬性設定為真,其結果是使用者在改變自己的密碼之前,可以由ChangePassword控制項進行認證,或者通過網站認證的使用者輸入不同的帳號來改變密碼。例子還連結到了建立使用者頁面,使你能夠建立有效使用者並測試樣本。

<%@ Page Language="VB" MasterPageFile="~/Site.master"%>
<asp:Content ID="Content1" ContentPlaceHolderId="MainBody" runat="server">
<asp:ChangePassword ID="ChangePassword1" runat="server" createuserurl="CreateUser.aspx" createusertext="Create a New Account" canceldestinationpageurl="HomeChangePassword.aspx" displayusername="true" continuedestinationpageurl="HomeChangePassword.aspx"/>
</asp:Content>

  使用成員和角色管理器API

  成員

  成員特性是圍繞兩個核心類構建的:Membership和MembershipUser。Membership類提供建立使用者(MembershipUser類處理)的方法,以及通用的系統管理使用者的方法。用Membership類建立的使用者是通過ASP.NET應用程式認證的身份。

  Membership類執行的通用事務包括:

  · 建立新的MembershipUser

  · 當使用者試圖登入的時候驗證使用者名稱-密碼組合。接下來你可以使用表單認證來產生一個cookie,表明使用者登入了網站。

  · 檢索MembershipUser執行個體

  · 更新MembershipUser執行個體

  · 根據不同的條件搜尋使用者

  · 擷取當前線上的通過認證的使用者

  · 在不需要使用者的時候從系統中刪除它

  一旦你擷取了MembershipUser執行個體,就可以直接使用MembershipUser類執行下面的事務:

  · 訪問應用程式中的MembershipUser類的屬性

  · 檢索使用者的密碼(只有把成員特性配置為允許密碼檢索才可以使用)

  · 改變或重設使用者的密碼

  · 改變使用者的密碼提問和答案(如果成員特性被配置為在檢索或更新密碼之前,提示使用者密碼問題和答案)

  · 解鎖那些因為密碼錯誤或密碼答案錯誤而被鎖定的使用者

  角色管理器

  角色管理器的核心類是Roles類。Roles為建立角色和把使用者指定給角色提供方法。它也提供了用於管理角色資訊的方法。

  使用Roles類可以執行的通用事務包括:

  · 建立新角色

  · 刪除已有的角色

  · 把使用者指定給角色

  · 從角色中刪除使用者

  · 檢測某個使用者是否獲得了特定角色的授權

  · 搜尋特定角色中的使用者,檢索角色中的所有使用者

  · 擷取特定使用者的角色資訊

  角色管理器特性也包含了HttpModule。這個模組負責檢索使用者指派的角色並把這些資訊儲存在RolePrincipal內,而它存在於頁面的HttpContext中。HttpContext中存在RolePrincipal使你能夠利用<authorization>元素來保護頁面和目錄。依據RolePrincipal中儲存的角色資訊,使用者只能獲得網站內特定頁面和目錄的訪問權。

  樣本

  下面的例子示範了在應用程式中如何使用成員 API。

  建立新使用者

  下面的例子示範了如何建立新的MembershipUser。樣本使用了Membership.CreateUser重載,它返回一個狀態參數。其它的重載也可以使用,他們會拋出異常而不是返回狀態碼。請注意,在預設情況下,成員特性要求密碼至少有7個字元長度,並且密碼至少包含一個非數字字元。

<script runat="server">
Sub btnCreate_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim userName As String = txtUserId.Text
'這個值式加密的或散列過,不會顯示
Dim password As String = txtPassword.Text
Dim email As String = txtEmail.Text
Dim passwordQuestion As String = ddlPasswordQuestion.SelectedValue
'這個值式加密的或散列過,不會顯示
Dim passwordAnswer As String = txtPasswordAnswer.Text
Dim result As MembershipCreateStatus

Membership.CreateUser(userName, password, email, passwordQuestion, passwordAnswer, True, result)

lblResults.Visible = True
Select Case result
Case MembershipCreateStatus.Success
txtUserId.Text = Nothing
txtPassword.Text = Nothing
txtEmail.Text = Nothing
ddlPasswordQuestion.SelectedIndex = -1
txtPasswordAnswer.Text = Nothing
lblResults.Text = "User successfully created!"
Case MembershipCreateStatus.InvalidUserName
lblResults.Text = "The username format was invalid. Please enter a different username."
Case MembershipCreateStatus.InvalidPassword
lblResults.Text = "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 MembershipCreateStatus.InvalidEmail
lblResults.Text = "The email format was invalid. Please enter a different username."
Case MembershipCreateStatus.InvalidQuestion
lblResults.Text = "The password question format was invalid. Please enter a different question."
Case MembershipCreateStatus.InvalidAnswer
lblResults.Text = "The password answer format was invalid. Please enter a different answer."
Case MembershipCreateStatus.DuplicateUsername
lblResults.Text = "The username is already in use. Please enter a new username."
Case MembershipCreateStatus.DuplicateEmail
lblResults.Text = "The email address is already in use. Please enter a different email address."
Case Else
lblResults.Text = "An error occurred while creating the user."
End Select
End Sub
</script>
  使用者登入和訪問使用者屬性

  下面的例子示範了使用者使用Membership.ValidateUser方法登入。它還示範了在登入使用者的時候如何同時使用表單認證和成員特性。在上面的例子中建立使用者之後,請在登入頁面上輸入憑證。一旦你登入了,你會被重新導向到一個頁面,該頁面利用Membership.GetUser來檢索與登入使用者相對應的MembershipUser執行個體。同時請注意,這個頁面還顯示了目錄上設定的使用者屬性,這些內容只有通過認證的使用者才能訪問。點擊頁面底部的登出連結可以退出網站。

<script runat="server">
Protected memUser As MembershipUser

Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
memUser = Membership.GetUser()
End Sub

Sub linkLogout_Click(ByVal sender As Object, ByVal e As System.EventArgs)
FormsAuthentication.SignOut()
Roles.DeleteCookie()
FormsAuthentication.RedirectToLoginPage()
End Sub
</script>

User Name/ID: <% = Server.HtmlEncode(memUser.Username) %>
Email:<% = Server.HtmlEncode(memUser.Email) %>
  更新使用者屬性

  請用前面建立的使用者憑證登入。頁面會用ASP.NET 2.0中新的DetailsView控制項顯示使用者屬性。DetailsView控制項與一個資料來源控制項通訊。在例子中,ObjectDataSource控制項檢索MembershipUser執行個體的內容。你可以點擊頁面底部的"編輯"連結使DetailsView進入編輯模式。MembershipUser的電子郵件和注釋都可以修改。點擊"更新"連結可以把新值儲存到資料庫。請注意,在代碼中頁面實現了ItemUpdating事件,該事件是由ObjectDataSource引發的。這樣做是必要的,MembershipUser類沒有參數化建構函式,它要求使用ObjectDataSource的雙向資料繫結。點擊登出連結可以退出。

Sub DetailsView1_ItemUpdating(ByVal sender As Object, ByVal e as DetailsViewUpdateEventArgs)
'必須手動處理更新操作,因為MembershipUser 沒有參數化的建構函式
Dim memUser as MembershipUser = Membership.GetUser()

memUser.Email = CStr(e.NewValues(0))
memUser.Comment = CStr(e.NewValues(1))

Try
Membership.UpdateUser(memUser)
e.Cancel = true
DetailsView1.ChangeMode(DetailsViewMode.ReadOnly)
Catch ex as Exception
Response.Write("<div>The following error occurred:<font color='red'> " + ex.Message + "</font></div>")
e.Cancel = true
End Try
End Sub

  帳號鎖定

  Membership特性自動地跟蹤使用者重試密碼的次數。在檢索密碼或重設密碼的時候,它也跟蹤密碼重試的次數。下面的例子示範了自動的帳號鎖定能力,以及如何取消帳號鎖定。首先使用前面的"建立新使用者"樣本建立一個新帳號。接著,點擊下方的按鈕運行"帳號登出"樣本。登入頁面顯示了顯示了為了鎖定帳號需要重試的失敗次數。在登入頁面上,使用你建立的第一個帳號並輸入錯誤的密碼。請注意,在重試的失敗次數到了之後,如果你使用了正確的密碼,也不能登入了--這是因為在重試失敗的次數到了一定的數量之後,Membership特性自動地鎖定的帳號。為瞭解除該帳號的鎖定,請使用你建立的第二個帳號登入。顯示的頁面與前面的顯示使用者屬性的例子很相似。但是,這個頁面允許你在頁面底部輸入任意的使用者名稱稱。請輸入被鎖定的帳號並斷行符號。DetailsView控制項會重新整理並顯示該使用者的資訊。請注意,標識鎖定狀態的檢查框IsLockedOut是選中的。LastLockoutDate也被更新了,它顯示了使用者被鎖定的日期。點擊頁面底部的"解鎖"按鈕來解除當前顯示的使用者的鎖。它調用了MembershipUser執行個體的UnlockUser方法,解除了使用者的鎖。在解除使用者的鎖之後,IsLockedOut檢查框被清除了,LastLockoutDate屬性也被重設了。點擊頁面底部的登出連結。現在嘗試用第一個帳號登入。現在可以再次成功登入了。

Sub btnUnlockUser_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim memUser as MembershipUser = Membership.GetUser(txtUserName.Text)
If (Not memUser is Nothing And memUser.IsLockedOut = true)
memUser.UnlockUser()
End If

'重新整理被選中使用者的資訊
DetailsView1.DataBind()
End Sub
  刪除使用者

  你可以使用Membership.DeleteUser方法刪除使用者。下面的例子示範了如何使用表單認證刪除當前登入的使用者並讓該使用者登出。

<script runat="server">
Sub btnDeleteCurrentUser_Click(ByVal sender As Object, ByVal e As System.EventArgs)
If (Membership.DeleteUser(User.Identity.Name)) Then
FormsAuthentication.SignOut()
Roles.DeleteCookie()
Response.Redirect("~/CreatingUsers.aspx")
Else
lblResult.Visible = True
lblResult.Text = "The Membership user was not deleted."
End If
End Sub
</script>

  管理角色

  下面的例子示範了認證使用者如何使用角色管理器特性。所有的樣本頁面都拒絕匿名使用者存取。在預設情況下,ASP.NET中是沒有啟用角色管理器特性的。但是,下面的例子中使用的web.config顯式地啟用了角色管理器特性。

  添加和刪除角色

  下面的例子示範了如何使用Roles.CreateRole和Roles.DeleteRole方法建立和刪除角色。在你建立角色或刪除已有角色之後,頁面使用Roles.GetAllRoles方法顯示系統中的所有可用角色。Roles.GetAllRoles的傳回值可以輕易地綁定到任何支援資料繫結的控制項。你至少需要建立一個叫做"Administrators"的角色。

  在你建立和刪除角色的時候,請注意角色管理器特性不允許你建立重複的角色。同時還要注意,在預設情況下,角色管理器不允許你刪除填充過的角色。

Sub btnCreateRole_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim roleName As String = txtCreateRole.Text

Try
Roles.CreateRole(roleName)
lblResults.Text = Nothing
lblResults.Visible = False
txtCreateRole.Text = Nothing
Catch ex As Exception
lblResults.Text = "Could not create the role: " + Server.HtmlEncode(ex.Message)
lblResults.Visible = True
End Try
End Sub

Sub btnDeleteRole_Click(ByVal sender As Object, ByVal e As System.EventArgs)
If (lbxAvailableRoles.SelectedIndex <> -1) Then
Try
Roles.DeleteRole(lbxAvailableRoles.SelectedValue)

lblResults.Text = Nothing
lblResults.Visible = False
Catch ex As Exception
lblResults.Text = "Could not delete the role: " + Server.HtmlEncode(ex.Message)
lblResults.Visible = True
End Try
End If
End Sub
  向角色中添加使用者和從角色中刪除使用者

  下面的例子使用了前面例子中建立的角色,它示範了如何向角色添加使用者和從角色中刪除使用者。使用Roles.AddUserToRole方法向角色中添加使用者,使用Roles.RemoveUserFromRole方法從角色中刪除使用者。在給角色添加使用者之前,先檢查該使用者是否已經是該角色的成員。這種檢查是必要的,因為如果你試圖給角色多次添加同一個使用者,角色管理器會拋出異常。在前面的例子中,角色資訊和角色的成員都顯示在資料繫結控制項中。使用者所屬的角色列表通過Roles.GetRolesForUser方法擷取。要運行下面的例子,就要確保把你自己加入"Administrators"角色。

Sub btnAddUserToRole_Click(ByVal sender As Object, ByVal e As System.EventArgs)
If (lbxAvailableRoles.SelectedIndex <> -1) Then
Dim selectedRole As String = lbxAvailableRoles.SelectedValue

If Not Roles.IsUserInRole(selectedRole) Then
Try
Roles.AddUserToRole(User.Identity.Name, selectedRole)
RefreshCurrentRolesListBox()
Catch ex As Exception
lblResults.Text = "Could not add the user to the role: " + Server.HtmlEncode(ex.Message)
lblResults.Visible = True
End Try
Else
lbxAvailableRoles.SelectedIndex = -1
End If
End If
End Sub

Sub btnDeleteUserFromRole_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim selectedRole As String = lbxUserRoles.SelectedValue

If (lbxUserRoles.SelectedIndex <> -1) Then
Try
Roles.RemoveUserFromRole(User.Identity.Name, selectedRole)
RefreshCurrentRolesListBox()
Catch ex As Exception
lblResults.Text = "Could not remove the user from the role: " + Server.HtmlEncode(ex.Message)
lblResults.Visible = True
End Try
End If
End Sub

  用角色管理器對頁面進行授權訪問

  這個例子的web.config檔案包含了<authorization>元素,它限制了樣本只能讓"Administrators"角色的成員訪問。請確保你已經建立了"Administrators"角色並把自己添加到了這個角色中。一旦你稱為"Administrators"角色的成員,就可以訪問樣本頁面了。ASP.NET提供了一個角色管理器HttpModule,它自動地把RolePrincipal附加到當前請求的HttpContext上。如果你是"Administrators"角色的成員,當URL授權過程根據RolePrincipal執行IsInRole檢查(URL授權程序呼叫RolePrincipal.IsInRole)的時候,該訪問檢查會返回true,你就可以訪問頁面了。請注意,你可以通過調用Page.User並把結果轉換RolePrincipal來引用頁面中的RolePrincipal。

<location path="administrators_role">
<system.web>
<authorization>
<allow roles="Administrators" />
<deny users="*"/>
</authorization>
</system.web>
</location>
  編程檢查授權

  由於角色管理器特性把RolePrincipal附加到HttpContext上,你也可以編寫代碼根據RolePrincipal執行訪問檢查。你先建立兩個角色"Regular Users"和"Power Users",把自己添加到這兩個角色中。當你運行樣本的時候,頁面使用多種技術執行IsInRole檢查。有些訪問檢查使用了User.IsInRole。它說明了使用正常的Page.User文法的時候,RolePrincipal也是可用的。這個頁面還示範了如何把Page.User轉換為RolePrincipal引用,接著直接在RolePrincipal上調用IsInRole。

<asp:Label ID="Label1" runat="server" Text=<%# User.IsInRole("Administrators") %> />
<asp:Label ID="Label2" runat="server" Text=<%# Roles.IsUserInRole("Regular Users") %> />
<asp:Label ID="Label3" runat="server" Text=<%# (CType(User,RolePrincipal)).IsInRole("Power Users") %> />



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.