如何:使用 WIF 和 ACS 在宣告感知 ASP.NET 應用程式中實作角色型存取控制 (RBAC)
更新日期:2015 年 6 月 19 日
適用對象:Azure
套用至
Microsoft Azure Active Directory 存取控制服務 (也稱為「存取控制服務」或 ACS)
Windows® Identity Foundation (WIF)
ASP.NET
總結
本主題說明如何使用 WIF 和 ACS 在宣告感知 ASP.NET Web 應用程式中實作角色型存取控制 (RBAC) 授權。
目錄
目標
概觀
步驟摘要
步驟 1 – 建立一個簡單的宣告感知 ASP.NET Web 應用程式
步驟 2 – 在 ACS 中設定角色宣告
步驟 3 – 在 ASP.NET Web 應用程式中實作角色檢查
步驟 4 – 使用自訂的 ClaimsAuthenticationManager 來實作宣告轉換
步驟 5 – 測試您的工作
相關項目:
目標
使用 ACS 設定角色宣告。
使用 ClaimsAuthenticationManager 轉換角色宣告。
使用 IsInRole 方法和 PrinciaplPermission 屬性實作角色型存取控制檢查。
概觀
RBAC 是廣受採用的方法,適用於限制應用程式中的存取。 在 ASP.NET Web 應用程式中,此方法是使用IsInRole方法、PrincipalPermission屬性或需求來實作,自 ASP.NET 1.0 起已提供。 您可以使用宣告進行授權,藉此保留妥善建立的作法,同時使用 WIF 和 ACS 等新技術。 您可在此處下載 WIF 執行階段和 SDK:
步驟摘要
步驟 1 – 建立一個簡單的宣告感知 ASP.NET Web 應用程式
步驟 2 – 在 ACS 中設定角色宣告
步驟 3 – 在 ASP.NET Web 應用程式中實作角色檢查
步驟 4 – 使用自訂的 ClaimsAuthenticationManager 來實作宣告轉換
步驟 5 – 測試您的工作
步驟 1 – 建立一個簡單的宣告感知 ASP.NET Web 應用程式
此步驟說明如何建立一個基本 ASP.NET Web 應用程式,作為實作 RBAC 的基準。
建立一個簡單的 ASP.NET Web 應用程式
使用 [以系統管理員身分執行] 選項啟動 Visual Studio。 此為 WIF 所需。
建立新的 ASP.NET 空 Web 應用程式。
新增 aspx Web 表格,然後為它命名,例如 default.aspx。
步驟 2 – 在 ACS 中設定角色宣告
此步驟說明如何使用規則群組,在 ACS 管理入口網站上設定角色宣告。 如需完整的逐步解說,請參閱 如何:使用規則實作權杖轉換邏輯 。
在 ACS 管理入口網站上設定角色宣告
在 [編輯信賴憑證者應用程式] 頁面上,向下捲到 [規則群組] 區段,然後按一下想要的群組連結。 確定已選取此選項。
在 [編輯規則群組] 頁面上,向下捲到 [規則] 區段,然後按一下 [新增規則] 連結。
在 [新增宣告規則] 頁面上,向下捲到 [輸出宣告類型] 區段,按一下 [選取類型] 選擇鈕,然後選擇下列宣告類型。
https://schemas.microsoft.com/ws/2008/06/identity/claims/role
在 [ 輸出宣告值 ] 區段中,按一下 [ 輸入值],然後在文字方塊中輸入下列文字作為值:
使用者選擇性 (建議) 新增說明,然後按一下 [儲存]。
您剛剛設定了可新增到任何權杖中的「使用者」角色宣告。 該案例可能因您的需求而有所不同。 如需設定更複雜的規則的詳細資訊,請參閱 如何:使用規則實作權杖轉換邏輯。
步驟 3 – 在 ASP.NET Web 應用程式中實作角色檢查
此步驟說明如何實作 RBAC。
在 ASP.NET 網頁上實作 RBAC
新增對 Microsoft.IdentityModel 組件的參照。
開啟 default.aspx.cs 背後的程式碼。
使用宣告新增下列屬性。
using System.Security.Permissions; using System.Threading; using Microsoft.IdentityModel.Claims; using System.Security;
使用下列安全性需求裝飾 Page_Load 事件處理常式。 這個屬性會檢查目前的使用者是否具有「使用者」角色。 如果沒有,則會丟出一個例外。
[PrincipalPermission(SecurityAction.Demand, Role = "User")]
將下列程式碼新增到 Page_Load 事件處理常式的本文。 它與在程式碼中表示需求的方式完全相同。
PrincipalPermission p = new PrincipalPermission(null, "User"); p.Demand();
將下列程式碼新增到 Page_Load 事件的本文。 和前一個程式碼相反,這個程式碼不會丟出例外。 IsInRole returns 布林值反而指出目前的使用者具有指定的角色。
if (!User.IsInRole("User")) throw new SecurityException("Access is denied.");
完成後的程式碼外觀應與下列內容類似。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Security.Permissions; using System.Threading; using Microsoft.IdentityModel.Claims; using System.Security; namespace WebIsInRoleACS { public partial class _default : System.Web.UI.Page { //THIS SHOULD THROW AN EXCEPTION [PrincipalPermission(SecurityAction.Demand, Role = "User")] protected void Page_Load(object sender, EventArgs e) { //THIS SHOULD THROW AN EXCEPTION PrincipalPermission p = new PrincipalPermission(null, "User"); p.Demand(); //THIS RETURNS BOOL if (!User.IsInRole("User")) throw new SecurityException("Access is denied."); } } }
步驟 4 – 使用自訂的 ClaimsAuthenticationManager 來實作宣告轉換
這是選擇性步驟。 此步驟說明如何使用 ClaimsAuthenticationManager 來轉換宣告,這是在 ASP.NET 應用程式內容中執行的 WIF 管線,而不是在 ACS 上執行的宣告轉換規則,如步驟 2 – 在 ACS 中設定角色宣告中所述。
使用自訂的 ClaimsAuthenticationManager 實作宣告轉換
將 [類別庫] 專案新增到 Visual Studio 方案,然後為它命名,例如 MyClaimsTransformationModule。
新增對 Microsoft.IdentityModel 組件的參照。
新增對 System.IdentityModel 組件的參照。
建立一個新類別,並為它命名,例如 ClaimsTransformationModule。
將下列宣告新增到類別。
using Microsoft.IdentityModel.Claims; using System.Security.Principal;
從 [ClaimsAuthenticationManager] 類型衍生類別。
置換其 [驗證] 方法 (這是將發生宣告轉換的地方)。 您用於 [驗證] 方法的程式碼可以根據下列原則。
if (incomingPrincipal != null && incomingPrincipal.Identity.IsAuthenticated == true) { //DECIDE ON SOME CRITERIA IF CURRENT USER DESERVES THE ROLE //IClaimsIdentity identity = (IClaimsIdentity)incomingPrincipal.Identity; ((IClaimsIdentity)incomingPrincipal.Identity).Claims.Add( new Claim(ClaimTypes.Role, "Admin")); } return incomingPrincipal;
切換到 ASP.NET 應用程式,並在其 web.config 中設定您的自訂 ClaimsAuthenticationManager。
<microsoft.identityModel> <service> <claimsAuthenticationManager type="MyClaimsTransformationModule.ClaimsTransformationModule, MyClaimsTransformationModule" />
確定應用程式可以找到您建立的新組件;最簡單的方式是將它放在應用程式的 bin 資料夾中。
步驟 5 – 測試您的工作
此步驟說明如何驗證方案可行。 若要測試您的方案,請按 F5 按鈕。 您的 ASP.NET Web 應用程式應該以偵錯模式執行 (您可以新增中斷點來驗證程式碼在 Visual Studio 內的執行情況)。 首先,系統會將您導向為同盟而設定的身分識別提供者所屬的驗證頁面。 在完成驗證後,系統會將您重新導回 Default.aspx 頁面,而不會丟出例外,這表示已滿足該「使用者」角色的所有安全性需求。