共用方式為


如何:使用 ACS 管理服務來設定規則和規則群組

更新日期:2015 年 6 月 19 日

適用對象:Azure

套用至

  • Microsoft Azure Active Directory 存取控制服務 (也稱為「存取控制服務」或 ACS)

概觀

您可以使用 ACS 管理入口網站 (來設定 ACS 規則和規則群組,如需詳細資訊,請參閱 規則群組和規則) 或 ACS 管理服務。 如果您要建置用於管理 ACS 的自訂使用者介面,或想要將多租使用者軟體即服務的新租使用者上線自動化,則使用 ACS 管理服務可以更有效率 (SaaS) 解決方案。

使用 ACS 管理服務設定規則與規則群組的步驟

重要

執行下列步驟之前,請確定您的系統符合 ACS 必要條件中摘要的所有 .NET Framework 和平臺需求。

若要使用 ACS 管理服務設定規則和規則群組,請完成下列步驟:

  • 步驟 1 – 收集 ACS 設定資訊

  • 步驟 2 – 建立範例主控台應用程式

  • 步驟 3 – 新增必要服務與組件的參考

  • 步驟 4 – 實作管理服務用戶端

  • 步驟 5 – 新增規則群組

  • 步驟 6 – 新增規則

步驟 1 – 收集 ACS 設定資訊

您可以使用 ACS 管理入口網站來收集必要的組態資訊。 如需如何啟動 ACS 管理入口網站的詳細資訊,請參閱 ACS 管理入口網站

收集 ACS 設定資訊

  1. 啟動 ACS 管理入口網站。 如需如何啟動 ACS 管理入口網站的詳細資訊,請參閱 ACS 管理入口網站

  2. 取得 ACS 管理服務帳戶的值。 您可以使用預設的ManagementClient 帳戶。 若要檢視此值,請在 ACS 管理入口網站中,按一下頁面左側樹狀結構中 [系統管理] 區段下的 [管理服務]。

  3. 取得 ACS 管理服務帳戶密碼的值。 若要檢視此值,請執行下列動作:

    1. 在 ACS 管理入口網站中,按一下頁面左側樹狀目錄中 [管理] 區段下的 [管理服務]。

    2. 在 [管理服務] 頁面上,按一下 [管理服務帳戶] 下方的 ManagementClient

    3. 在 [編輯管理服務帳戶] 頁面的 [認證] 下方,按一下 [密碼]

    4. 在 [編輯管理認證] 頁面上,複製 [密碼] 欄位中的值。

  4. 從 Azure 入口網站,或從 ACS 管理入口網站的 URL 取得 Azure 命名空間的名稱。 例如,在 中 http://contoso.accesscontrol.windows.net ,名稱為 contoso。

  5. 取得 ACS 主機名稱。 此值通常為accesscontrol.windows.net

步驟 2 – 建立範例主控台應用程式

在此步驟中,您會建立範例主控台應用程式,以執行程式碼來新增 ACS 規則群組和規則。

建立範例主控台應用程式

  1. 開啟 Visual Studio 2012,並在已安裝Windows範本下建立新的主控台應用程式專案。

  2. 將下列程式碼新增至 Program 類別中,然後將 serviceIdentityPasswordForManagement、serviceNamespace 與 acsHostName 等變數指派給您在前一個步驟中收集到的適當設定資訊。

    public const string serviceIdentityUsernameForManagement = "ManagementClient";
    public const string serviceIdentityPasswordForManagement = "My Password/Key for ManagementClient";
    public const string serviceNamespace = "MyNameSpaceNoDots";
    public const string acsHostName = "accesscontrol.windows.net";
    public const string acsManagementServicesRelativeUrl = "v2/mgmt/service/";
    static string cachedSwtToken;
    

步驟 3 – 新增必要服務與組件的參考

在此步驟中,您會識別必要的相依性,並將其新增至服務與組件。

將必要的相依性新增到服務與組件

  1. 以滑鼠右鍵按一下 [參考],再按一下 [新增參考],然後新增參考至 System.Web.Extensions。

    注意

    您可能必須在 [方案總管] 中以滑鼠右鍵按一下您的範例主控台應用程式名稱,選取 [內容],然後將範例應用程式的目標架構從 [.NET Framework 4 用戶端設定檔] (在您建立新的主控台應用程式時依預設指派的) 變更為 [.NET Framework 4]

  2. 以滑鼠右鍵按一下 [服務參考],按一下 [新增服務參考],然後將服務參考新增至管理服務。 管理服務的 URL 對您的命名空間而言是唯一的,而且外觀應與下列內容類似:

    HTTPs:// YOURNAMESPACE.accesscontrol.windows.net/v2/mgmt/service

  3. 新增下列宣告,其中 MyConsoleApplication 是您主控台應用程式的名稱,MyServiceReference 是您服務參考的名稱:

    using System.Web;
    using System.Net;
    using System.Data.Services.Client;
    using System.Collections.Specialized;
    using System.Web.Script.Serialization;
    using System.Globalization;
    using System.Runtime.Serialization.Json; 
    using MyConsoleApplication.MyServiceReference;
    

步驟 4 – 實作管理服務用戶端

在此步驟中,您會實作管理服務用戶端。

實作管理服務用戶端

  1. 將下列方法加入至 Program 類別:

       public static ManagementService CreateManagementServiceClient()
            {
                string managementServiceEndpoint = String.Format(CultureInfo.InvariantCulture, "https://{0}.{1}/{2}",
                    serviceNamespace,
                    acsHostName,
                    acsManagementServicesRelativeUrl);
                ManagementService managementService = new ManagementService(new Uri(managementServiceEndpoint));
    
                managementService.SendingRequest += GetTokenWithWritePermission;
    
                return managementService;
            }
    
  2. 將下列程式碼新增至 Program 類別,以建立 GetTokenWithWritePermission 方法及其協助程式方法。 GetTokenWithWritePermission 及其協助程式會將 SWT OAuth 權杖新增至 HTTP 要求的授權標頭。

    public static void GetTokenWithWritePermission(object sender, SendingRequestEventArgs args)
            {
                GetTokenWithWritePermission((HttpWebRequest)args.Request);
            }
    
            public static void GetTokenWithWritePermission(HttpWebRequest args)
            {
                if (cachedSwtToken == null)
                {
                    cachedSwtToken = GetTokenFromACS();
                }
    
                args.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + cachedSwtToken);
            }
    
            private static string GetTokenFromACS()
            {
                //
                // Request a token from ACS
                //
                WebClient client = new WebClient();
                client.BaseAddress = string.Format(CultureInfo.CurrentCulture, 
                                                   "https://{0}.{1}", 
                                                   serviceNamespace, 
                                                   acsHostName);
    
                NameValueCollection values = new NameValueCollection();
                values.Add("grant_type", "client_credentials");
                values.Add("client_id", serviceIdentityUsernameForManagement);
                values.Add("client_secret", serviceIdentityPasswordForManagement);
                values.Add("scope", client.BaseAddress + acsManagementServicesRelativeUrl);
    
                byte[] responseBytes = client.UploadValues("/v2/OAuth2-13", "POST", values);
    
                string response = Encoding.UTF8.GetString(responseBytes);
    
                // Parse the JSON response and return the access token 
                JavaScriptSerializer serializer = new JavaScriptSerializer();
    
                Dictionary<string, object> decodedDictionary = serializer.DeserializeObject(response) as Dictionary<string, object>;
    
                return decodedDictionary["access_token"] as string;
    
            }
    

步驟 5 – 新增規則群組

在此步驟中,您會使用在上個步驟中建立的管理服務用戶端來新增規則群組。

新增規則群組

  1. 將下列程式碼新增至 Program 類別中的 Main 方法,以初始化管理服務用戶端。

    ManagementService svc = CreateManagementServiceClient();
    
  2. 將下列程式碼新增至 Program 類別中的 Main 方法,以新增您新的規則群組 (您可以將其命名為 “mygroup”,如下列程式碼所示),並儲存變更。

    RuleGroup rg = new RuleGroup();
                rg.Name = "mygroup";
                svc.AddToRuleGroups(rg);
                svc.SaveChanges(SaveChangesOptions.Batch);
    

步驟 6 – 新增規則

在此步驟中,您會使用 ACS 管理服務,將規則新增至您在上一個步驟中建立的規則群組。

新增規則

  1. 建立 「LOCAL AUTHORITY」 的變數,這是代表您存取控制命名空間命名空間的內建簽發者名稱,方法是將下列程式碼新增至Program類別中的Main方法:

    // "LOCAL AUTHORITY" is a built-in IDP name that represents the Access Control namespace. 
    Issuer localAuthority = svc.Issuers.Where(m => m.Name == "LOCAL AUTHORITY").FirstOrDefault();
    
  2. 執行下列其中一個動作:

    1. 若要新增基本規則,請將下列程式碼新增至 Program 類別中的 Main 方法:

                  //EXAMPLE #1 - BASIC RULE
                  Rule basicRule = new Rule()
                  {
                      InputClaimType = "https://acs/your-input-type",
                      InputClaimValue = "inputValue",
                      OutputClaimType = "https://acs/your-output-type",
                      OutputClaimValue = "outputValue",
                  };
      
                  basicRule.Description = string.Format(CultureInfo.InvariantCulture,
                      "Transforms claim from {0} with type: {1}, value: {2}, into a new claim with type: {3}, value:{4}",
                      "ACS",
                      basicRule.InputClaimType,
                      basicRule.InputClaimValue,
                      basicRule.OutputClaimType,
                      basicRule.OutputClaimValue);
      
                  svc.AddToRules(basicRule);
                  svc.SetLink(basicRule, "RuleGroup", rg);
                  svc.SetLink(basicRule, "Issuer", localAuthority);                                              
                    svc.SaveChanges(SaveChangesOptions.Batch);
      
    2. 若要一個可將特定輸入宣告和值原封不動傳遞至應用程式的規則,請將下列程式碼新增至 Program 類別中的 Main 方法:

      //EXAMPLE #2 - PASS TYPE AND VALUE RULE
                  Rule passSpecificClaimRule = new Rule()
                  {
                      InputClaimType = "https://acs/your-input-type2",
                      InputClaimValue = "inputValue2",
                  };
      
                  passSpecificClaimRule.Description = string.Format(CultureInfo.InvariantCulture,
                      "Passthough claim from {0} with type: {1}, value: {2}",
                      "ACS",
                      passSpecificClaimRule.InputClaimType,
                      passSpecificClaimRule.InputClaimValue);
      
                  svc.AddToRules(passSpecificClaimRule);
                  svc.SetLink(passSpecificClaimRule, "RuleGroup", rg);
                  svc.SetLink(passSpecificClaimRule, "Issuer", localAuthority); 
      svc.SaveChanges(SaveChangesOptions.Batch);
      
    3. 若要新增規則來傳遞具有指定類型的任何宣告,請將下列程式碼新增至 Program 類別中的 Main 方法:

      //EXAMPLE #3 PASS SPECIFIC TYPE RULE
                  Rule passAnyClaimSpecificTypeRule = new Rule()
                  {
                      InputClaimType = "https://acs/your-input-type3",
                  };
      
                  passAnyClaimSpecificTypeRule.Description = string.Format(CultureInfo.InvariantCulture,
                      "Pass claim from {0} with type: {1}, and any value",
                      "ACS",
                      passSpecificClaimRule.InputClaimType);
      
                  svc.AddToRules(passAnyClaimSpecificTypeRule);
                  svc.SetLink(passAnyClaimSpecificTypeRule, "RuleGroup", rg);
                  svc.SetLink(passAnyClaimSpecificTypeRule, "Issuer", localAuthority); 
      svc.SaveChanges(SaveChangesOptions.Batch);
      
    4. 若要新增規則來傳遞具有指定值的任何輸入宣告,請將下列程式碼新增至 Program 類別中的 Main 方法:

      //EXAMPLE #4 PASS ANY CLAIM W/SPECIFIC VALUE RULE
                  Rule passAnyClaimSpecificValueRule = new Rule()
                  {
                      InputClaimValue = "inputValue3",
                  };
      
                  passAnyClaimSpecificValueRule.Description = string.Format(CultureInfo.InvariantCulture,
                      "Pass claim from {0} with any type, and specific value {1}",
                      "ACS",
                      passSpecificClaimRule.InputClaimValue);
      
                  svc.AddToRules(passAnyClaimSpecificValueRule);
                  svc.SetLink(passAnyClaimSpecificValueRule, "RuleGroup", rg);
                  svc.SetLink(passAnyClaimSpecificValueRule, "Issuer", localAuthority); 
      svc.SaveChanges(SaveChangesOptions.Batch);
      
    5. 若要新增規則來將指定的輸入宣告類型轉換成不同的輸出宣告類型,但不會變更宣告值,請將下列程式碼新增至 Program 類別中的 Main 方法:

      //EXAMPLE #5 COMPLEX RULE
                  Rule complexTransformationRule = new Rule()
                  {
                      InputClaimType = "https://acs/your-input-type4",
                      OutputClaimType = "https://acs/your-output-type2",
                  };
      
                  complexTransformationRule.Description = string.Format(CultureInfo.InvariantCulture,
                      "Transforms claim from {0} with type: {1}, and any value, into a new claim with type: {2}, keeping(passingthough) old value",
                      "ACS",
                      complexTransformationRule.InputClaimType,
                      complexTransformationRule.OutputClaimType);
      
                  svc.AddToRules(complexTransformationRule);
                  svc.SetLink(complexTransformationRule, "RuleGroup", rg);
                  svc.SetLink(complexTransformationRule, "Issuer", localAuthority);
      
                  svc.SaveChanges(SaveChangesOptions.Batch);
      

另請參閱

概念

ACS 的作法