如何:使用 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 應用程式

  1. 使用 [以系統管理員身分執行] 選項啟動 Visual Studio。 此為 WIF 所需。

  2. 建立新的 ASP.NET 空 Web 應用程式。

  3. 新增 aspx Web 表格,然後為它命名,例如 default.aspx。

步驟 2 – 在 ACS 中設定角色宣告

此步驟說明如何使用規則群組,在 ACS 管理入口網站上設定角色宣告。 如需完整的逐步解說,請參閱 如何:使用規則實作權杖轉換邏輯

在 ACS 管理入口網站上設定角色宣告

  1. 在 [編輯信賴憑證者應用程式] 頁面上,向下捲到 [規則群組] 區段,然後按一下想要的群組連結。 確定已選取此選項。

  2. 在 [編輯規則群組] 頁面上,向下捲到 [規則] 區段,然後按一下 [新增規則] 連結。

  3. 在 [新增宣告規則] 頁面上,向下捲到 [輸出宣告類型] 區段,按一下 [選取類型] 選擇鈕,然後選擇下列宣告類型。

    https://schemas.microsoft.com/ws/2008/06/identity/claims/role
    
  4. 在 [ 輸出宣告值 ] 區段中,按一下 [ 輸入值],然後在文字方塊中輸入下列文字作為值:
    使用者

  5. 選擇性 (建議) 新增說明,然後按一下 [儲存]

您剛剛設定了可新增到任何權杖中的「使用者」角色宣告。 該案例可能因您的需求而有所不同。 如需設定更複雜的規則的詳細資訊,請參閱 如何:使用規則實作權杖轉換邏輯

步驟 3 – 在 ASP.NET Web 應用程式中實作角色檢查

此步驟說明如何實作 RBAC。

在 ASP.NET 網頁上實作 RBAC

  1. 新增對 Microsoft.IdentityModel 組件的參照。

  2. 開啟 default.aspx.cs 背後的程式碼。

  3. 使用宣告新增下列屬性。

    using System.Security.Permissions;
    using System.Threading;
    using Microsoft.IdentityModel.Claims;
    using System.Security;
    
  4. 使用下列安全性需求裝飾 Page_Load 事件處理常式。 這個屬性會檢查目前的使用者是否具有「使用者」角色。 如果沒有,則會丟出一個例外。

    [PrincipalPermission(SecurityAction.Demand, Role = "User")]
    
  5. 將下列程式碼新增到 Page_Load 事件處理常式的本文。 它與在程式碼中表示需求的方式完全相同。

    PrincipalPermission p = new PrincipalPermission(null, "User");
       p.Demand();
    
  6. 將下列程式碼新增到 Page_Load 事件的本文。 和前一個程式碼相反,這個程式碼不會丟出例外。 IsInRole returns 布林值反而指出目前的使用者具有指定的角色。

    if (!User.IsInRole("User"))
                    throw new SecurityException("Access is denied.");
    
  7. 完成後的程式碼外觀應與下列內容類似。

    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 實作宣告轉換

  1. 將 [類別庫] 專案新增到 Visual Studio 方案,然後為它命名,例如 MyClaimsTransformationModule。

  2. 新增對 Microsoft.IdentityModel 組件的參照。

  3. 新增對 System.IdentityModel 組件的參照。

  4. 建立一個新類別,並為它命名,例如 ClaimsTransformationModule。

  5. 將下列宣告新增到類別。

    using Microsoft.IdentityModel.Claims;
    using System.Security.Principal;
    
  6. 從 [ClaimsAuthenticationManager] 類型衍生類別。

  7. 置換其 [驗證] 方法 (這是將發生宣告轉換的地方)。 您用於 [驗證] 方法的程式碼可以根據下列原則。

    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;
    
  8. 切換到 ASP.NET 應用程式,並在其 web.config 中設定您的自訂 ClaimsAuthenticationManager。

      <microsoft.identityModel>
        <service>
          <claimsAuthenticationManager type="MyClaimsTransformationModule.ClaimsTransformationModule, MyClaimsTransformationModule" />
    
  9. 確定應用程式可以找到您建立的新組件;最簡單的方式是將它放在應用程式的 bin 資料夾中。

步驟 5 – 測試您的工作

此步驟說明如何驗證方案可行。 若要測試您的方案,請按 F5 按鈕。 您的 ASP.NET Web 應用程式應該以偵錯模式執行 (您可以新增中斷點來驗證程式碼在 Visual Studio 內的執行情況)。 首先,系統會將您導向為同盟而設定的身分識別提供者所屬的驗證頁面。 在完成驗證後,系統會將您重新導回 Default.aspx 頁面,而不會丟出例外,這表示已滿足該「使用者」角色的所有安全性需求。