本文档已存档,并且将不进行维护。

操作方法:使用 ACS 管理服务配置规则和规则组

发布时间: 2011年4月

更新时间: 2015年6月

应用到: Azure

  • Microsoft Azure Active Directory 访问控制(也称为访问控制服务或 ACS)

可以使用 ACS 管理门户(有关详细信息,请参阅规则组和规则)或 ACS 管理服务配置 ACS 规则和规则组。如果你要构建用于管理 ACS 的自定义用户界面,或者要自动为多租户软件即服务 (SaaS) 解决方案加入新租户,则使用 ACS 管理服务会更有效率。

Important重要提示
在执行以下步骤之前,请确保你的系统满足 ACS 先决条件中汇总的所有 .NET Framework 和平台要求。

若要使用 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 Client Profile(在创建新的控制台应用程序时默认分配)更改为 .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;
    
    

在此步骤中,你将实现管理服务客户端。

  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 请求的 Authorization 标头。

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

另请参阅

显示: