如何:使用 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 設定資訊
啟動 ACS 管理入口網站。 如需如何啟動 ACS 管理入口網站的詳細資訊,請參閱 ACS 管理入口網站。
取得 ACS 管理服務帳戶的值。 您可以使用預設的ManagementClient 帳戶。 若要檢視此值,請在 ACS 管理入口網站中,按一下頁面左側樹狀結構中 [系統管理] 區段下的 [管理服務]。
取得 ACS 管理服務帳戶密碼的值。 若要檢視此值,請執行下列動作:
在 ACS 管理入口網站中,按一下頁面左側樹狀目錄中 [管理] 區段下的 [管理服務]。
在 [管理服務] 頁面上,按一下 [管理服務帳戶] 下方的 ManagementClient。
在 [編輯管理服務帳戶] 頁面的 [認證] 下方,按一下 [密碼]。
在 [編輯管理認證] 頁面上,複製 [密碼] 欄位中的值。
從 Azure 入口網站,或從 ACS 管理入口網站的 URL 取得 Azure 命名空間的名稱。 例如,在 中 http://contoso.accesscontrol.windows.net ,名稱為 contoso。
取得 ACS 主機名稱。 此值通常為accesscontrol.windows.net 。
步驟 2 – 建立範例主控台應用程式
在此步驟中,您會建立範例主控台應用程式,以執行程式碼來新增 ACS 規則群組和規則。
建立範例主控台應用程式
開啟 Visual Studio 2012,並在已安裝Windows範本下建立新的主控台應用程式專案。
將下列程式碼新增至 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 – 新增必要服務與組件的參考
在此步驟中,您會識別必要的相依性,並將其新增至服務與組件。
將必要的相依性新增到服務與組件
以滑鼠右鍵按一下 [參考],再按一下 [新增參考],然後新增參考至 System.Web.Extensions。
注意
您可能必須在 [方案總管] 中以滑鼠右鍵按一下您的範例主控台應用程式名稱,選取 [內容],然後將範例應用程式的目標架構從 [.NET Framework 4 用戶端設定檔] (在您建立新的主控台應用程式時依預設指派的) 變更為 [.NET Framework 4]。
以滑鼠右鍵按一下 [服務參考],按一下 [新增服務參考],然後將服務參考新增至管理服務。 管理服務的 URL 對您的命名空間而言是唯一的,而且外觀應與下列內容類似:
HTTPs:// YOURNAMESPACE.accesscontrol.windows.net/v2/mgmt/service
新增下列宣告,其中 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 – 實作管理服務用戶端
在此步驟中,您會實作管理服務用戶端。
實作管理服務用戶端
將下列方法加入至 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; }
將下列程式碼新增至 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 – 新增規則群組
在此步驟中,您會使用在上個步驟中建立的管理服務用戶端來新增規則群組。
新增規則群組
將下列程式碼新增至 Program 類別中的 Main 方法,以初始化管理服務用戶端。
ManagementService svc = CreateManagementServiceClient();
將下列程式碼新增至 Program 類別中的 Main 方法,以新增您新的規則群組 (您可以將其命名為 “mygroup”,如下列程式碼所示),並儲存變更。
RuleGroup rg = new RuleGroup(); rg.Name = "mygroup"; svc.AddToRuleGroups(rg); svc.SaveChanges(SaveChangesOptions.Batch);
步驟 6 – 新增規則
在此步驟中,您會使用 ACS 管理服務,將規則新增至您在上一個步驟中建立的規則群組。
新增規則
建立 「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();
執行下列其中一個動作:
若要新增基本規則,請將下列程式碼新增至 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);
若要一個可將特定輸入宣告和值原封不動傳遞至應用程式的規則,請將下列程式碼新增至 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);
若要新增規則來傳遞具有指定類型的任何宣告,請將下列程式碼新增至 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);
若要新增規則來傳遞具有指定值的任何輸入宣告,請將下列程式碼新增至 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);
若要新增規則來將指定的輸入宣告類型轉換成不同的輸出宣告類型,但不會變更宣告值,請將下列程式碼新增至 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);