次の方法で共有


方法: ACS 管理サービスを使用して AD FS 2.0 をEnterprise ID プロバイダーとして構成する

更新日: 2015 年 6 月 19 日

適用先:Azure

適用対象

  • Microsoft® Azure™ Access Control Service (ACS)

  • Active Directory フェデレーション サービス (AD FS) 2.0

まとめ

このトピックでは、ID プロバイダーを名前空間または証明書利用者アプリケーションに追加する方法について説明します。 このタスクを実行するには、ACS 管理サービスを使用できます。 管理サービスは、ACS を管理するためのカスタム ユーザー インターフェイスを構築する場合や、マルチテナント サービスとしてのソフトウェア (SaaS) ソリューションの新しいテナントの追加を自動化する場合に特に便利です。

内容

  • 目標

  • 概要

  • 手順の要約

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

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

  • 手順 3 – 管理サービス プロキシを実装する

  • 手順 4 – ID プロバイダーを追加する

  • 手順 5 – 作業をテストする

目標

  • 要件および構成情報を特定する。

  • 必要な手順を一覧表示する。

  • 構成が正常に完了したことを確認する。

概要

ACS 管理サービスは、ACS 機能をコードに公開する Web サービスです。 ACS 管理サービスは、ACS 管理ポータルのユーザー インターフェイスで使用できる機能サブセットを含め、すべての ACS 機能にアクセスできます。

MICROSOFT を ID プロバイダーとして ACS に追加すると、企業 ID 管理に対する投資をクラウドベースのソリューションに再利用できます。 ID プロバイダーとして構成するには、特定の手順に従うコードを記述する必要があります。 このトピックでは、これらの基本手順の概要を示します。

手順の要約

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

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

  • 手順 3 – 管理サービス プロキシを実装する

  • 手順 4 – ID プロバイダーを追加する

  • 手順 5 – 作業をテストする

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

この手順では、必要な構成情報の収集方法について説明します。 次の情報を収集する必要があります。

  • 管理サービス ID ユーザー名。 既定値は ManagementClient です。

  • 管理サービス ID パスワード。

  • 名前空間の名前。

  • ACS ホスト名: accesscontrol.windows.net

  • 署名証明書の文字列: 展開から AD FS 署名証明書の文字列を取得します。

管理サービス ID ユーザー名とパスワードを検索するには、次の手順を使用します。

  1. Microsoft Azure管理ポータル (https://manage.WindowsAzure.com) に移動し、サインインし、[Active Directory] をクリックします。 (トラブルシューティングのヒント: "Active Directory" 項目が見つからないか、使用できません)Access Control名前空間を管理するには、名前空間を選択し、[管理] をクリックします。 または、[アクセス制御名前空間] をクリックして名前空間を選択し、[管理] をクリックします。

  2. [管理サービス] をクリックしてから、[ManagementClient] などの管理サービスを選択します。

  3. [名前] フィールドの値は、管理サービス ID ユーザー名です

  4. [資格情報] セクションで、[パスワード] をクリックします。 パスワード フィールドの値は管理サービス ID パスワードです。

必要な情報を収集したら、次の手順に従って、ID プロバイダーとして追加するコードを実行するサンプル コンソール アプリケーションを作成します。

  1. Visual Studioを開始し、新しいコンソール アプリケーション プロジェクトを作成します。

  2. Program クラスで、モジュール スコープを持つ変数に構成情報値を割り当てます。 この方法は以下のコード サンプルに示されています。

    static string serviceIdentityUsernameForManagement = "ManagementClient";
    static string serviceIdentityPasswordForManagement = "ManagementClientPasswordValue";
    
    static string serviceNamespace = "MyNameSpaceNoDots";
    static string acsHostName = "accesscontrol.windows.net";
    
    static string signingCertificate = "Very long string representing ADFS signing certificate";
    
    static string cachedSwtToken;
    static string identityProviderName = "My Other ADFS Identity Provider";
    

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

この手順では、サービスとアセンブリに必要な依存関係を特定し、追加します。

サービスとアセンブリに必要な依存関係を追加するには

  1. System.Web.Extensions への参照を追加します。

  2. 管理サービスへのサービス参照を追加します。 管理サービスの URL は名前空間に対して一意であり、次のような形式です。

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

  3. 次の宣言を追加します。

    using System.Web; 
    using System.Net; 
    using System.Data.Services.Client; 
    using System.Collections.Specialized; 
    using System.Web.Script.Serialization;
    

手順 3 – 管理サービス プロキシを実装する

この手順では、管理サービス プロキシの実装をカプセル化するメソッドを作成します。

管理サービス プロキシを実装するには

  1. Program クラスに次のメソッドを追加します。

    public static ManagementService CreateManagementServiceClient()
            {
                string managementServiceHead = "v2/mgmt/service/";
                string managementServiceEndpoint = 
    string.Format("https://{0}.{1}/{2}", 
    serviceNamespace, 
    acsHostName, 
    managementServiceHead);
                ManagementService managementService = 
    new ManagementService(new Uri(managementServiceEndpoint));
    
                managementService.SendingRequest += GetTokenWithWritePermission;
    
                return managementService;
            }
    
  2. GetTokenWithWritePermission メソッドとそのヘルパー メソッドを実装します。 これにより、SWT OAuth トークンが HTTP 要求の承認ヘッダーに追加されます。

            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, 
     string.Format("OAuth {0}", 
     cachedSwtToken));
            }
    
            private static string GetTokenFromACS()
            {
                // request a token from ACS
                WebClient client = new WebClient();
                client.BaseAddress = string.Format("https://{0}.{1}", 
          serviceNamespace, 
          acsHostName);
    
                NameValueCollection values = new NameValueCollection();
    
                values.Add("grant_type", "password");
                values.Add("client_id", serviceIdentityUsernameForManagement);
                values.Add("username", serviceIdentityUsernameForManagement);
                values.Add("client_secret", serviceIdentityPasswordForManagement);
                values.Add("password", serviceIdentityPasswordForManagement);
    
                byte[] responseBytes = 
    client.UploadValues("/v2/OAuth2-13/rp/AccessControlManagement", 
          "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;
    
            }
    

手順 4 – ID プロバイダーを追加する

この手順では、前に作成した管理サービス プロキシを使用して ID プロバイダーとして追加します。

AD FS 2.0 を ID プロバイダーとして追加するには

  1. 管理サービス プロキシを初期化します。

    ManagementService svc = CreateManagementServiceClient();
    
  2. ID プロバイダーを発行者として追加します。

    Issuer issuer = new Issuer
           {
           Name = identityProviderName
    };
           svc.AddToIssuers(issuer);
           svc.SaveChanges(SaveChangesOptions.Batch);
    
  3. ID プロバイダーを作成します。

    IdentityProvider identityProvider = new IdentityProvider()
    {
        DisplayName = identityProviderName,
        Description = identityProviderName,
        WebSSOProtocolType = "WsFederation",
        IssuerId = issuer.Id
    };
           svc.AddObject("IdentityProviders", identityProvider);
    
  4. あらかじめ取得した証明書に基づいて、ID プロバイダー署名キーを作成します。

    IdentityProviderKey identityProviderKey = new IdentityProviderKey()
    {
        DisplayName = "SampleIdentityProviderKeyDisplayName",
        Type = "X509Certificate",
        Usage = "Signing",
        Value = Convert.FromBase64String(signingCertificate),
        IdentityProvider = identityProvider,
        StartDate = startDate,
        EndDate = endDate,
    };
          svc.AddRelatedObject(identityProvider, 
    "IdentityProviderKeys", 
    identityProviderKey);
    
  5. ID プロバイダーのサインイン アドレスを更新します。

    IdentityProviderAddress realm = new IdentityProviderAddress()
    {
        Address = "http://SampleIdentityProvider.com/sign-in/",
        EndpointType = "SignIn",
        IdentityProvider = identityProvider,
    };
    svc.AddRelatedObject(identityProvider, "IdentityProviderAddresses", realm);
    
    svc.SaveChanges(SaveChangesOptions.Batch);
    
  6. 管理サービスを除く証明書利用者が ID プロバイダーが使用できるようにします。

    foreach (RelyingParty rp in svc.RelyingParties)
    {
        // skip the built-in management RP. 
        if (rp.Name != "AccessControlManagement")
        {
            svc.AddToRelyingPartyIdentityProviders(new RelyingPartyIdentityProvider()
            {
                IdentityProviderId = identityProvider.Id,
                RelyingPartyId = rp.Id
            });
        }
    }
    
    svc.SaveChanges(SaveChangesOptions.Batch);
    

手順 5 – 作業をテストする

作業をテストするには

  1. [Access Control Service] ページで、[信頼関係] セクションの [規則グループ] リンクをクリックします。

  2. 使用可能ないずれかの規則をクリックします。

  3. [規則グループの編集] ページで、[規則の追加] リンクをクリックします。

  4. [要求規則の追加] ページで、[要求の発行者] セクションのドロップダウン リストから新しく追加した ID プロバイダーを選択します。

  5. 残りの値は既定値のまま使用します。

  6. [保存] をクリックします。

これで、ID プロバイダーのパススルー規則が作成されました。