エクスポート (0) 印刷
すべて展開

方法:ACS 管理サービスを使用して証明書とキーを構成する

発行: 2011年4月

更新日: 2011年5月

適用対象: Windows Azure

適用の対象

  • Windows Azure AppFabric アクセス制御サービス (ACS)

概要

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

ACS 管理サービスを使用して証明書とキーを構成する手順

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

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 です。

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

この手順では、ACS 規則グループと規則を追加するコードを実行できるサンプル コンソール アプリケーションを作成します。

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

  1. Visual Studio 2010 を開き、インストールされている 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;
    
    

手順 3 - 必要なサービスおよびアセンブリへの参照を追加する

この手順では、サービスおよびアセンブリへの必要な依存関係を確認し、追加します。

サービスおよびアセンブリへの必要な依存関係を追加するには

  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.IO;
    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. GetTokenWithWritePermission メソッドとそのヘルパー メソッドを Program クラスに追加します。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 - 認証とキーを追加する

ACS サービス名前空間で使用するトークン署名証明書を追加する

この例では、ACS サービス名前空間に割り当てた X.509 署名証明書を作成します。

ACS サービス名前空間全体で使用するトークン署名証明書を追加するには

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

    ManagementService svc = CreateManagementServiceClient();
    
    
  2. Program クラスに次のコードを追加して、X.509 証明書からバイトを読み取るヘルパー関数 ReadBytesFromPfxFile を作成します。

    //Helper function to read bytes from your .pfx file
    
            public static byte[] ReadBytesFromPfxFile(string pfxFileName, string protectionPassword)
            {
                byte[] signingCertificate;
                using (FileStream stream = File.OpenRead(pfxFileName))
                {
                    using (BinaryReader br = new BinaryReader(stream))
                    {
                        signingCertificate = br.ReadBytes((int)stream.Length);
                    }
                }
                return signingCertificate;
            }
    
    
  3. トークン署名 X.509 証明書を追加するには、Program クラスの Main メソッドに次のコードを追加します。

    noteメモ
    次のコードの「Full path to your .PFX file」には、自身の X.509 証明書への有効な完全パスを入力してください。たとえば、ACS2ClientCertificate.pfx という証明書が C:\ の下に保存されている場合、正しい値は「C:\ ACS2ClientCertificate.pfx」となります。

    次のコードの「MyCertificatePassword」には、自身の X.509 証明書の正しいパスワードを入力してください。

    X509Certificate2 cert = new X509Certificate2(@"Full path to your .PFX file", “MyCertificatePassword”);
                
                DateTime startDate, endDate;
                startDate = cert.NotBefore.ToUniversalTime();
                endDate = cert.NotAfter.ToUniversalTime();
               string pfxFileName = @"Full path to your .PFX file";
                string pfxPassword = @"MyCertificatePassword";
                
    byte[] signingCertificate = ReadBytesFromPfxFile(pfxFileName, pfxPassword);
    
    ServiceKey serviceKey = new ServiceKey()
                {
                    Type = "X509Certificate",
                    Usage = "Signing",
                    Value = signingCertificate,
                      Password = Encoding.UTF8.GetBytes("MyCertificatePassword"),
                      IsPrimary = false,
                    StartDate = startDate.ToUniversalTime(),
                    EndDate = endDate.ToUniversalTime()
                };
                svc.AddToServiceKeys(serviceKey);
                svc.SaveChanges(SaveChangesOptions.Batch);
    
    

特定の証明書利用者アプリケーションで使用するトークン署名証明書を追加する

この例では、特定の証明書利用者アプリケーションに割り当てた X.509 署名証明書を作成します。

特定の証明書利用者アプリケーションで使用するトークン署名証明書を追加するには

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

    ManagementService svc = CreateManagementServiceClient();
    
    
  2. Program クラスに次のコードを追加して、X.509 証明書からバイトを読み取るヘルパー関数 ReadBytesFromPfxFile を作成します。

    //Helper function to read bytes from your .pfx file
    
            public static byte[] ReadBytesFromPfxFile(string pfxFileName, string protectionPassword)
            {
                byte[] signingCertificate;
                using (FileStream stream = File.OpenRead(pfxFileName))
                {
                    using (BinaryReader br = new BinaryReader(stream))
                    {
                        signingCertificate = br.ReadBytes((int)stream.Length);
                    }
                }
                return signingCertificate;
            }
    
    
  3. トークン署名 X.509 証明書を追加するには、Program クラスの Main メソッドに次のコードを追加します。

    noteメモ
    次のコードの「Full path to your .PFX file」には、自身の X.509 証明書への有効な完全パスを入力してください。たとえば、ACS2ClientCertificate.pfx という証明書が C:\ の下に保存されている場合、正しい値は「C:\ ACS2ClientCertificate.pfx」となります。

    次のコードの「MyCertificatePassword」には、自身の X.509 証明書の正しいパスワードを入力してください。

    次のコードの「MyRelyingPartyApplication」には、このトークン署名証明書を使用する既存の証明書利用者アプリケーションの正しい名前を入力してください。

    //Select an existing Relying Party Application by its name
    
                RelyingParty relyingParty = svc.RelyingParties.Where(m => m.Name == "MyRelyingPartyApplication").Single();
             
               // Add a signing certificate
    
               X509Certificate2 cert = new X509Certificate2(@"Full path to your .PFX file", "MyCertificatePassword");
               DateTime startDate, endDate;
               startDate = cert.NotBefore.ToUniversalTime();
               endDate = cert.NotAfter.ToUniversalTime();
    
               string pfxFileName = @"Full path to your .PFX file";
               string pfxPassword = "MyCertificatePassword";
    
                byte[] signingCertificate = ReadBytesFromPfxFile(pfxFileName, pfxPassword);
    
               RelyingPartyKey relyingPartyKey = new RelyingPartyKey()
                {
                    StartDate = startDate.ToUniversalTime(),
                   EndDate = endDate.ToUniversalTime(),
                    Type = "X509Certificate",
                    Usage = "Signing",
                    IsPrimary = true,
                    Value = signingCertificate,
                   Password = Encoding.UTF8.GetBytes("MyCertificatePassword")
                };
    
    // Add the new signing certificate to the selected Relying Party Application
    
                svc.AddRelatedObject(relyingParty, "RelyingPartyKeys", relyingPartyKey);
    
    
            
                //Save your relying party application
    
                svc.SaveChanges(SaveChangesOptions.Batch);
    
    

ACS サービス名前空間で使用するトークン署名対称キーを追加する

この例では、この署名対称キーを ACS サービス名前空間に割り当てます。

ACS サービス名前空間で使用するトークン署名対称キーを追加するには

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

    ManagementService svc = CreateManagementServiceClient();
    
    
  2. トークン署名対称キーを追加するには、Program クラスの Main メソッドに次のコードを追加します。

           string symKey = "SampleTokenSigningSymmetricKey";
                DateTime startDate, endDate;
                startDate = DateTime.UtcNow;
                endDate = DateTime.MaxValue;
    
                ServiceKey serviceKey = new ServiceKey()
                {
                    
                    Type = "Symmetric",
                    Usage = "Signing",
                    Value = Encoding.UTF8.GetBytes(symKey),
                    StartDate = startDate.ToUniversalTime(),
                    EndDate = endDate.ToUniversalTime()
                };
                svc.AddToServiceKeys(serviceKey);
                svc.SaveChanges(SaveChangesOptions.Batch);
    
    

特定の証明書利用者アプリケーション用のトークン署名対称キーを追加する

この例では、特定の証明書利用者アプリケーションに割り当てた新しい署名対称キーを割り当てます。

特定の証明書利用者アプリケーションで使用するトークン署名対称キーを追加するには

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

    ManagementService svc = CreateManagementServiceClient();
    
    
  2. トークン署名対称キーを追加するには、Program クラスの Main メソッドに次のコードを追加します。

          //Select a relying party application
    
                RelyingParty relyingParty = svc.RelyingParties.Where(m => m.Name == "MyRelyingPartyApplication").Single();
             
               // Create a symmetric key
    
                string symKey = "SampleTokenSigningSymmetricKey";
                DateTime startDate, endDate;
                startDate = DateTime.UtcNow;
                endDate = DateTime.MaxValue;
    
                RelyingPartyKey relyingPartyKey = new RelyingPartyKey()
                {
    
                    Type = "Symmetric",
                    Usage = "Signing",
                    Value = Encoding.UTF8.GetBytes(symKey),
                    StartDate = startDate.ToUniversalTime(),
                    EndDate = endDate.ToUniversalTime()
                };
             
                //Assign this symmetric key to the selected relying party application 
    
                svc.AddRelatedObject(relyingParty, "RelyingPartyKeys", relyingPartyKey);
    
                   //Save your symmetric key
    
                svc.SaveChanges(SaveChangesOptions.Batch);        
    
    

トークン暗号化証明書を追加する

この例では、特定の証明書利用者アプリケーションに割り当てた X.509 トークン暗号化証明書を追加します。

特定の証明書利用者アプリケーションで使用するトークン暗号化証明書を追加するには

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

    ManagementService svc = CreateManagementServiceClient();
    
    
  2. トークン暗号化 X.509 証明書を追加するには、Program クラスの Main メソッドに次のコードを追加します。

    noteメモ
    次のコードの「Full path to your .CER file」には、X.509 証明書への有効な完全パスを入力してください。たとえば、ACS2ClientCertificate.cer という証明書が C:\ の下に保存されている場合、正しい値は「C:\ ACS2ClientCertificate.cer」です。

    次のコードの「MyCertificatePassword」には、自身の X.509 証明書の正しいパスワードを入力してください。

    次のコードの「MyRelyingPartyApplication」には、このトークン署名証明書を使用する既存の証明書利用者アプリケーションの正しい名前を入力してください。

    //Select a relying party application
    
                RelyingParty relyingParty = svc.RelyingParties.Where(m => m.Name == "MyRelyingPartyApplication").Single();
             
               // Add an encryption certificate
    
                X509Certificate2 cert = new X509Certificate2(@"Full path to your .CER file");
                DateTime startDate, endDate; 
                  startDate = cert.NotBefore;
                  endDate = cert.NotAfter;
    
                RelyingPartyKey relyingPartyKey = new RelyingPartyKey()
                {
                    Type = "X509Certificate",
                    Usage = "Encrypting",
                    Value = cert.GetRawCertData(),
                    StartDate = startDate.ToUniversalTime(),
                    EndDate = endDate.ToUniversalTime()
                };
             
                //Assign this encryption certificate to the selected relying party application 
    
                svc.AddRelatedObject(relyingParty, "RelyingPartyKeys", relyingPartyKey);
    
                   //Save your encryption certificate
    
                svc.SaveChanges(SaveChangesOptions.Batch);     
    
    

トークン暗号化解除証明書を追加する

この例では、ACS サービスの名前空間に割り当てた X.509 トークン暗号化解除証明書を追加します。

ACS サービス名前空間全体で使用するトークン署名証明書を追加するには

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

    ManagementService svc = CreateManagementServiceClient();
    
    
  2. Program クラスに次のコードを追加して、X.509 証明書からバイトを読み取るヘルパー関数 ReadBytesFromPfxFile を作成します。

    //Helper function to read bytes from your .pfx file
    
            public static byte[] ReadBytesFromPfxFile(string pfxFileName, string protectionPassword)
            {
                byte[] decryptionCertificate;
                using (FileStream stream = File.OpenRead(pfxFileName))
                {
                    using (BinaryReader br = new BinaryReader(stream))
                    {
                        decryptionCertificate = br.ReadBytes((int)stream.Length);
                    }
                }
                return decryptingCertificate;
            }
    
    
  3. トークン署名 X.509 証明書を追加するには、Program クラスの Main メソッドに次のコードを追加します。

    noteメモ
    次のコードの「Full path to your .PFX file」には、自身の X.509 証明書への有効な完全パスを入力してください。たとえば、ACS2ClientCertificate.pfx という証明書が C:\ の下に保存されている場合、正しい値は「C:\ ACS2ClientCertificate.pfx」となります。

    次のコードの「MyCertificatePassword」には、自身の X.509 証明書の正しいパスワードを入力してください。

    X509Certificate2 cert = new X509Certificate2(@"Full path to your .PFX file", “MyCertificatePassword”);
                
                DateTime startDate, endDate;
                startDate = cert.NotBefore.ToUniversalTime();
                endDate = cert.NotAfter.ToUniversalTime();
               string pfxFileName = @"Full path to your .PFX file";
                string pfxPassword = @"MyCertificatePassword";
                
    byte[] decryptionCertificate = ReadBytesFromPfxFile(pfxFileName, pfxPassword);
    
    ServiceKey serviceKey = new ServiceKey()
                {
                    Type = "X509Certificate",
                    Usage = "Encrypting",
                    Value = decryptionCertificate,
                      Password = Encoding.UTF8.GetBytes("MyCertificatePassword"),
                    StartDate = startDate.ToUniversalTime(),
                    EndDate = endDate.ToUniversalTime()
                };
                svc.AddToServiceKeys(serviceKey);
                svc.SaveChanges(SaveChangesOptions.Batch);
    
    

参照

表示:
© 2014 Microsoft