导出 (0) 打印
全部展开
展开 最小化

操作方法:使用 ACS 管理服务配置服务标识

发布时间: 2011年4月

更新时间: 2015年3月

应用到: 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 命名空间的值。可以从 Azure 门户或 ACS 管理门户的 URL 中获取此值。例如,在 http://contoso.accesscontrol.windows.net 中,Azure 命名空间的值为 contoso

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

在此步骤中,你将创建一个示例控制台应用程序,该应用程序可以运行用于添加 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;
    
    

在此步骤中,你将确定所需的依赖项并将其添加到服务和程序集中。

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

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

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

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

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

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

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

      note备注
      你可以将此服务标识称为“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 方法:

      note备注
      你可以将此服务标识称为“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 方法:

      note备注
      你可以将此服务标识称为“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);
      
      

另请参阅

社区附加资源

添加
显示:
© 2015 Microsoft