方法: ACS 管理サービスを使用してサービス ID を構成する

更新日: 2015 年 6 月 19 日

適用先:Azure

適用対象

  • Microsoft Azure Active Directory アクセス制御 (アクセス制御サービスまたは ACS)

概要

ACS 管理ポータル (詳細については、サービス ID を参照) または ACS 管理サービスを使用して ACS サービス ID を構成できます。 ACS 管理サービスの使用は、ACS を管理するためのカスタム ユーザー インターフェイスを構築する場合や、マルチテナント サービスとしてのソフトウェア (SaaS) ソリューションの新しいテナントのオンボードを自動化する場合に、より効率的になります。

ACS 管理サービスを使用するサービス ID の構成手順

重要

次の手順を実行する前に、システムが ACS の前提条件に要約されているすべての .NET フレームワークとプラットフォームの要件を満たしていることを確認します。

ACS 管理サービスを使用してサービス ID を構成するには、次の手順を実行します。

  • 手順 1 – ACS 構成情報を収集する

  • 手順 2 – サンプル コンソール アプリケーションを作成する

  • 手順 3 – 必要なサービスとアセンブリへの参照を追加する

  • 手順 4 – 管理サービス クライアントを実装する

  • 手順 5 - サービス ID を追加する

手順 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 portalまたは ACS 管理ポータルの URL から取得できます。 たとえば、Azure http://contoso.accesscontrol.windows.net名前空間の値は contoso です

  5. ACS ホスト名の値を取得します。 通常、これは accesscontrol.windows.net です。

手順 2 – サンプル コンソール アプリケーションを作成する

この手順では、ACS サービス ID を追加するためのコードを実行できるサンプル コンソール アプリケーションを作成します。

サンプル コンソール アプリケーションを作成するには

  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 とそのヘルパーにより、HTTP 要求の承認ヘッダーに SWT OAuth トークンが追加されます。

    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 - サービス ID を追加する

この手順では、上記の手順で作成した管理サービス クライアントを使用して、サービス ID を追加します。 ACS サービス ID では、資格情報の種類として、パスワード、対称キー、または X.509 証明書を使用できます。

サービス ID を追加するには

  1. 次のコードを Program クラスの Main メソッドに追加して、管理サービス クライアントを初期化します。

    ManagementService svc = CreateManagementServiceClient();
    
  2. 次のいずれかの操作を行います。

    • パスワードに関連付けられているサービス ID を追加して変更を保存するには、Program クラスの Main メソッドに以下のコードを追加します。

      注意

      以下のコードに示されているように、このサービス ID に "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);
      
    • 対称キーに関連付けられているサービス ID を追加して変更を保存するには、Program クラスの Main メソッドに以下のコードを追加します。

      注意

      以下のコードに示されているように、このサービス ID に "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 証明書に関連付けられているサービス ID を追加して変更を保存するには、Program クラスの Main メソッドに以下のコードを追加します。

      注意

      以下のコードに示されているように、このサービス ID に "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 の利用方法