如何:使用 ACS 管理服务配置服务标识

更新时间:2015 年 6 月 19 日

适用于:Azure

应用于

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

概述

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

使用 ACS 管理服务配置服务标识的步骤

重要

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

若要使用 ACS 管理服务配置服务标识,请完成以下步骤:

  • 步骤 1 - 收集 ACS 配置信息

  • 步骤 2 - 创建示例控制台应用程序

  • 步骤 3 - 添加对所需服务和程序集的引用

  • 步骤 4 - 实现管理服务客户端

  • 步骤 5 - 添加服务标识

步骤 1 - 收集 ACS 配置信息

可以使用 ACS 管理门户收集必要的配置信息。 有关如何启动 ACS 管理门户的详细信息,请参阅 ACS 管理门户

收集 ACS 配置信息

  1. 启动 ACS 管理门户。 有关如何启动 ACS 管理门户的详细信息,请参阅 ACS 管理门户

  2. 获取 ACS 管理服务帐户的值。 可以使用默认的 ManagementClient 帐户。 若要查看此值,请在 ACS 管理门户中单击页面左侧树中的“管理”部分下的管理服务

  3. 获取 ACS 管理服务帐户密码的值。 若要查看此值,请执行以下操作:

    1. 在 ACS 管理门户中,单击页面左侧树的“管理”部分下的管理服务

    2. “管理服务”页上,单击“管理服务帐户”下的 ManagementClient

    3. “编辑管理服务帐户”页上的“凭据”下,单击“密码”

    4. “编辑管理凭据”页上,复制“密码”字段中的值。

  4. 获取 Azure 命名空间的值。 可以从Azure 门户或 ACS 管理门户的 URL 获取此值。 例如,在 Azure http://contoso.accesscontrol.windows.net命名空间的值是 contoso

  5. 获取 ACS 主机名的值。 通常,它为 accesscontrol.windows.net

步骤 2 - 创建示例控制台应用程序

在此步骤中,你将创建一个示例控制台应用程序,该应用程序可以运行代码以添加 ACS 服务标识。

创建示例控制台应用程序

  1. 打开 Visual Studio 2012 并创建新的控制台应用程序项目。

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

  2. 右键单击“服务引用”,单击“添加服务引用”,然后添加对管理服务的服务引用。 管理服务 URL 对命名空间是唯一的,如下所示:

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

  3. 添加以下声明,其中 MyConsoleApplication 是控制台应用程序的名称,而 MyServiceReference 是服务引用的名称:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    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.Security.Cryptography;
    using System.Security.Cryptography.X509Certificates;
    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 请求的 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;
    
            }
    

步骤 5 - 添加服务标识

在此步骤中,你将使用你在前面的步骤中创建的管理服务客户端添加服务标识。 ACS 服务标识可以使用密码、对称密钥或 X.509 证书作为凭据类型。

添加服务标识

  1. 通过将以下代码添加到 Program 类中的 Main 方法初始化管理服务客户端:

    ManagementService svc = CreateManagementServiceClient();
    
  2. 执行下列操作之一:

    • 若要添加与密码关联的服务标识并保存更改,请将以下代码添加到 Program 类中的 Main 方法:

      注意

      你可以将此服务标识称为“SampleServiceIdentity”,并将其密码设为“SampleServiceIdentityPassword”,如以下代码所示。

                  string name = "SampleServiceIdentity";
                  string password = "SampleServiceIdentityPassword";
                  ServiceIdentity sid = new ServiceIdentity()
                  {
                      Name = name
                  };
      
                  DateTime startDate, endDate;
                  startDate = DateTime.UtcNow;
                  endDate = DateTime.MaxValue;
      
                  ServiceIdentityKey key = new ServiceIdentityKey()
                  {
                      EndDate = endDate.ToUniversalTime(),
                      StartDate = startDate.ToUniversalTime(),
                      Type = "Password",
                      Usage = "Password",
                      Value = Encoding.UTF8.GetBytes(password),
                      DisplayName = String.Format(CultureInfo.InvariantCulture, "{0} key for {1}", "Password", name)
                  };
      
                  svc.AddToServiceIdentities(sid);
                  svc.AddRelatedObject(
                      sid,
                      "ServiceIdentityKeys",
                      key);
      
      
                  svc.SaveChanges(SaveChangesOptions.Batch);
      
    • 若要添加与对称密钥关联的服务标识并保存更改,请将以下代码添加到 Program 类中的 Main 方法:

      注意

      你可以将此服务标识称为“SampleServiceIdentity”,并将其对称密钥值设为“SampleServiceIdentityPassword”,如以下代码所示。

                  string name = "SampleServiceIdentity";
                  string symKey = "SampleServiceIdentitySymmetricKey";
                  ServiceIdentity sid = new ServiceIdentity()
                  {
                      Name = name
                  };
      
                  DateTime startDate, endDate;
                  startDate = DateTime.UtcNow;
                  endDate = DateTime.MaxValue;
      
                  ServiceIdentityKey key = new ServiceIdentityKey()
                  {
                      EndDate = endDate.ToUniversalTime(),
                      StartDate = startDate.ToUniversalTime(),
                      Type = "Symmetric",
                      Usage = "Signing",
                      Value = Convert.FromBase64String(symKey),
                      DisplayName = String.Format(CultureInfo.InvariantCulture, "{0} key for {1}", "Sym Key", name)
                  };
      
                  svc.AddToServiceIdentities(sid);
                  svc.AddRelatedObject(
                      sid,
                      "ServiceIdentityKeys",
                      key);
      
      
                  svc.SaveChanges(SaveChangesOptions.Batch);
      
    • 若要添加与 X.509 证书关联的服务标识并保存更改,请将以下代码添加到 Program 类中的 Main 方法:

      注意

      你可以将此服务标识称为“SampleServiceIdentity”,如以下代码所示

      在以下代码中,将“Full path to your .CER file”替换为 X.509 证书的完全限定路径。 例如,如果名为 ACS2ClientCertificate.cer 的证书保存在 C:\ 中,则正确的值为“C:\ ACS2ClientCertificate.cer”。

                  string name = "SampleServiceIdentity";
                  X509Certificate2 cert = new X509Certificate2(@"Full path to your .CER file");
      
                  ServiceIdentity sid = new ServiceIdentity()
                  {
                      Name = name
                  };
      
                  DateTime startDate, endDate;
      
                  startDate = cert.NotBefore.ToUniversalTime();
                  endDate = cert.NotAfter.ToUniversalTime();
      
                  ServiceIdentityKey key = new ServiceIdentityKey()
                  {
                      EndDate = endDate.ToUniversalTime(),
                      StartDate = startDate.ToUniversalTime(),
                      Type = "X509Certificate",
                      Usage = "Signing",
                      Value = cert.GetRawCertData(),
                      DisplayName = String.Format(CultureInfo.InvariantCulture, "{0} key for {1}", "Cert", name)
                  };
      
                  svc.AddToServiceIdentities(sid);
                  svc.AddRelatedObject(
                      sid,
                      "ServiceIdentityKeys",
                      key);
      
      
                  svc.SaveChanges(SaveChangesOptions.Batch);
      

另请参阅

概念

ACS 操作指南