このページは役に立ちましたか。
このページのコンテンツについての ご意見をお待ちしております
その他にご意見はありますか。
残り 1500 文字
エクスポート (0) 印刷
すべて展開
展開 最小化

方法: ACS 管理サービスを使用して証明書利用者アプリケーションを構成する

発行: 2011年4月

更新日: 2015年6月

適用対象: Azure

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

ACS の証明書利用者アプリケーションは、ACS 管理ポータル (詳細については、「証明書利用者アプリケーション」を参照) または ACS 管理サービスのいずれかを使用して構成できます。ACS を管理するためのカスタム ユーザー インターフェイスを作成する場合や、マルチテナント SaaS (Software as a Service) ソリューションの新しいテナントのオンボーディングを自動化する場合に 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 では、この名前空間の名前は 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 はコンソール アプリケーションの名前です。

    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;
                  
    

この手順では、管理サービス クライアントを実装します。

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

この手順では、SAML 2.0 トークン形式 (既定のオプション)、トークン暗号化ポリシーなし (既定のオプション)、Windows Live ID (Microsoft アカウント) ID プロバイダーとの関連付け (既定のオプション)、600 秒のトークン有効期間 (既定のオプション)、および証明書利用者アプリケーション用のカスタムの X.509 トークン署名証明書または アクセス制御名前空間用のトークン署名証明書で、サンプルの証明書利用者アプリケーションを作成します。

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

    ManagementService svc = CreateManagementServiceClient();
    
    
  2. 新しい証明書利用者アプリケーション (以下のコードに示されているように “MyRelyingPartyApplication” という名前を付けることができます) を追加し、以下のコードを Program クラスの Main メソッドに追加して変更を保存します。

    noteメモ
    以下のコードの "Full path to your .PFX file" を X.509 証明書への有効な完全パスに置き換えます。たとえば、ACS2ClientCertificate.cer という証明書が C:\ に保存されている場合、正しい値は "C:\ ACS2ClientCertificate.cer" となります。

    以下のコードの "MyCertificatePassword" を X.509 証明書の正しいパスワードに置き換えます。

    
                //Create Relying Party Application
    
                RelyingParty relyingParty = new RelyingParty()
                {
                    Name = "MyRelyingPartyApplication",
                    AsymmetricTokenEncryptionRequired = false,
                    TokenType = "SAML_2_0",
                    TokenLifetime = 3600
                };
    
                svc.AddToRelyingParties(relyingParty);
    
    
                //Create the Realm Address
    
                RelyingPartyAddress realmAddress = new RelyingPartyAddress()
                {
                    Address = "http://TestRelyingParty.com/Realm",
                    EndpointType = "Realm"
                };
    
                svc.AddRelatedObject(relyingParty, "RelyingPartyAddresses", realmAddress);
    
                //Create the Return URL Address
    
                RelyingPartyAddress replyAddress = new RelyingPartyAddress()
                {
                    Address = "http://TestRelyingParty.com/Reply",
                    EndpointType = "Reply"
                };
    
                svc.AddRelatedObject(relyingParty, "RelyingPartyAddresses", replyAddress);
    
              // Create a Rule Group for This Relying Party Application
    
                RuleGroup rg = new RuleGroup();
                rg.Name = "SampleRuleGroup For " + relyingParty.Name;
                svc.AddToRuleGroups(rg);
    
                // Assign This New Rule Group to Your New Relying Party Application
    
                RelyingPartyRuleGroup relyingPartyRuleGroup = new RelyingPartyRuleGroup();
    
                svc.AddToRelyingPartyRuleGroups(relyingPartyRuleGroup);
                svc.AddLink(relyingParty, "RelyingPartyRuleGroups", relyingPartyRuleGroup);
                svc.AddLink(rg, "RelyingPartyRuleGroups", relyingPartyRuleGroup);
    
    
                //Save Your New Relying Party Application
    
                svc.SaveChanges(SaveChangesOptions.Batch);
    
    

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

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

    //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. 新しい証明書利用者アプリケーション (以下のコードに示されているように “MyRelyingPartyApplication” という名前を付けることができます) を追加し、以下のコードを Program クラスの Main メソッドに追加して変更を保存します。

    noteメモ
    以下のコードの "Full path to your .PFX file" を X.509 証明書への有効な完全パスに置き換えます。たとえば、ACS2ClientCertificate.cer という証明書が C:\ に保存されている場合、正しい値は "C:\ ACS2ClientCertificate.cer" となります。

    以下のコードの "MyCertificatePassword" を X.509 証明書の正しいパスワードに置き換えます。

    
                //Create Relying Party Application
    
                RelyingParty relyingParty = new RelyingParty()
                {
                    Name = "MyRelyingPartyApplication",
                    AsymmetricTokenEncryptionRequired = false,
                    TokenType = "SAML_2_0",
                    TokenLifetime = 3600
                };
    
                svc.AddToRelyingParties(relyingParty);
    
    
                //Create the Realm Address
    
                RelyingPartyAddress realmAddress = new RelyingPartyAddress()
                {
                    Address = "http://TestRelyingParty.com/Realm",
                    EndpointType = "Realm"
                };
    
                svc.AddRelatedObject(relyingParty, "RelyingPartyAddresses", realmAddress);
    
                //Create the Return URL Address
    
                RelyingPartyAddress replyAddress = new RelyingPartyAddress()
                {
                    Address = "http://TestRelyingParty.com/Reply",
                    EndpointType = "Reply"
                };
    
                svc.AddRelatedObject(relyingParty, "RelyingPartyAddresses", replyAddress);
    
                //Create 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")
                };
                svc.AddRelatedObject(relyingParty, "RelyingPartyKeys", relyingPartyKey);
    
    
              // Create a Rule Group for This Relying Party Application
    
                RuleGroup rg = new RuleGroup();
                rg.Name = "SampleRuleGroup For " + relyingParty.Name;
                svc.AddToRuleGroups(rg);
    
                // Assign This New Rule Group to Your New Relying Party Application
    
                RelyingPartyRuleGroup relyingPartyRuleGroup = new RelyingPartyRuleGroup();
    
                svc.AddToRelyingPartyRuleGroups(relyingPartyRuleGroup);
                svc.AddLink(relyingParty, "RelyingPartyRuleGroups", relyingPartyRuleGroup);
                svc.AddLink(rg, "RelyingPartyRuleGroups", relyingPartyRuleGroup);
    
    
                //Save Your New Relying Party Application
    
                svc.SaveChanges(SaveChangesOptions.Batch);
    
    

関連項目

コミュニティの追加

追加
表示:
© 2015 Microsoft