导出 (0) 打印
全部展开

如何:使用 ACS 管理服务来配置规则和规则组

发布时间: 2011年4月

更新时间: 2014年2月

应用到: 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. 获取 Windows Azure AppFabric 服务命名空间的值。您可以从 Windows Azure AppFabric 门户或您的 ACS 管理门户 URL 中获取此值。例如,在 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 方法及其 helper 方法。GetTokenWithWritePermission 及其 helper 将 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”(它是表示 ACS 服务命名空间本身的内置颁发者名称)建立变量。

    
    // "LOCAL AUTHORITY" is a built-in IDP name that represents the ACS service namespace itself. 
    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 - PASSTHROUGH SPECIFIC TYPE AND VALUE RULE
                  Rule passthroughSpecificClaimRule = new Rule()
                  {
                      InputClaimType = "https://acs/your-input-type2",
                      InputClaimValue = "inputValue2",
                  };
      
                  passthroughSpecificClaimRule.Description = string.Format(CultureInfo.InvariantCulture,
                      "Passthough claim from {0} with type: {1}, value: {2}",
                      "ACS",
                      passthroughSpecificClaimRule.InputClaimType,
                      passthroughSpecificClaimRule.InputClaimValue);
      
                  svc.AddToRules(passthroughSpecificClaimRule);
                  svc.SetLink(passthroughSpecificClaimRule, "RuleGroup", rg);
                  svc.SetLink(passthroughSpecificClaimRule, "Issuer", localAuthority); 
      svc.SaveChanges(SaveChangesOptions.Batch);
      
      
    3. 若要添加传递特定输入声明值的规则,请将下列代码添加到 Program 类的 Main 方法中:

      //EXAMPLE #3 PASSTHROUGH SPECIFIC TYPE RULE
                  Rule passthroughAnyClaimWithSpecificTypeRule = new Rule()
                  {
                      InputClaimType = "https://acs/your-input-type3",
                  };
      
                  passthroughAnyClaimWithSpecificTypeRule.Description = string.Format(CultureInfo.InvariantCulture,
                      "Passthough claim from {0} with type: {1}, and any value",
                      "ACS",
                      passthroughSpecificClaimRule.InputClaimType);
      
                  svc.AddToRules(passthroughAnyClaimWithSpecificTypeRule);
                  svc.SetLink(passthroughAnyClaimWithSpecificTypeRule, "RuleGroup", rg);
                  svc.SetLink(passthroughAnyClaimWithSpecificTypeRule, "Issuer", localAuthority); 
      svc.SaveChanges(SaveChangesOptions.Batch);
      
      
    4. 若要添加传递与特定值匹配的任何输入声明的规则,请将下列代码添加到 Program 类的 Main 方法中:

      //EXAMPLE #4 PASSTHROUGH ANY CLAIM W/SPECIFIC VALUE RULE
                  Rule passthroughAnyClaimWithSpecificValueRule = new Rule()
                  {
                      InputClaimValue = "inputValue3",
                  };
      
                  passthroughAnyClaimWithSpecificValueRule.Description = string.Format(CultureInfo.InvariantCulture,
                      "Passthough claim from {0} with any type, and specific value {1}",
                      "ACS",
                      passthroughSpecificClaimRule.InputClaimValue);
      
                  svc.AddToRules(passthroughAnyClaimWithSpecificValueRule);
                  svc.SetLink(passthroughAnyClaimWithSpecificValueRule, "RuleGroup", rg);
                  svc.SetLink(passthroughAnyClaimWithSpecificValueRule, "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);
      
      

另请参阅

社区附加资源

添加
显示:
© 2014 Microsoft