本文件已封存並已停止維護。

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

發佈時間: 2011年4月

更新日期: 2015年6月

適用於: Azure

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

您可以使用 ACS 管理入口網站來設定 ACS 規則與規則群組 (如需詳細資訊,請參閱規則群組和規則),或使用 ACS 管理服務來設定。若您要建立自訂的使用者介面以管理 ACS,或針對多用戶的「軟體即服務」(Software as a Service,SaaS) 解決方案自動化新用戶的報到機制時,使用 ACS 管理服務將可提高效益。

Important重要事項
在執行下列步驟之前,請確定您的系統符合 ACS 必要條件中摘要說明的所有 .NET 架構與平台需求。

若要使用 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 。

在此步驟中,您會建立可執行程式碼以新增 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;
    
    

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

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

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

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

    https://您的命名空間.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;
    
    

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

  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;
    
            }
    
    
    

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

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

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

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

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

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

    
    // "LOCAL AUTHORITY" is a built-in IDP name that represents the 存取控制命名空間. 
    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 的作法

顯示: