FedUtil を使用した ASP.NET 証明書利用者アプリケーションから STS への信頼の確立

Windows® Identity Foundation (WIF) には、FedUtil.exe が用意されています。 これは、証明書利用者 (RP) アプリケーションからセキュリティ トークン サービス (STS) に対して信頼を確立するのに役立ちます。 これには次の機能があります。

  • 既存の運用 STS を RP アプリケーションの信頼された発行者として登録する。

  • ローカル STS を提供して、要求に対応するアプリケーションの開発を支援する。

  • 既存のアプリケーションを要求に対応させる。

  • RP アプリケーションのフェデレーション メタデータを更新する。

  • RP アプリケーションのフェデレーション メタデータの自動更新をスケジュールする。

以降のセクションでは、FedUtil を使用してこれらの各タスクを実行する方法について説明します。 これらのタスクは、RP アプリケーションの web.config ファイルに手動で FedUtil と同じ変更を加えることでも実行できます。

注意

FedUtil によって構成ファイルが変更されるため、アプリケーションの既存のセキュリティ構成が変更されることがあります。 必要のない既存のセクションは削除されずにコメント アウトされますが、FedUtil の実行後に構成ファイルを開いて、アプリケーションが依存しているすべてのセキュリティ構成がコメント アウトされていないことを確認してください。 また、FedUtil では既存の構成ファイルのバックアップも行われます。

1. ローカル STS の作成

ここでは、要求に対応する ASP.NET 証明書利用者アプリケーションと共に使用するローカル STS を作成します。 これを行うには、Visual Studio 内から FedUtil を実行する必要があります。 この方法は、非運用 STS を使用して要求に対応する証明書利用者 ASP.NET アプリケーションを開発する場合に役立ちます。 運用 STS の使用に切り替える方法については、後で説明します。

注意

FedUtil が正常に機能するには、Visual Studio を管理者特権モードで実行する必要があります。

Visual Studio で、[ファイル] メニューを開き、[新規作成]、[Web サイト] の順に選択します。 要求に対応する ASP.NET Web サイトを選択します。

次に、ソリューション エクスプローラーでプロジェクトを右クリックし、[STS 参照の追加] を選択します。

79a0b161-f082-4c34-96e7-7da5d3126776

この操作により、FedUtil ツールが実行されます。 FedUtil のダイアログが開き、[フェデレーション ユーティリティ ウィザードの開始] ページが表示されます。

55362f83-729f-4ecb-84a6-7d7f18ce736a

このページでは、2 つのフィールドへの入力が必要です。

  1. [アプリケーション構成の場所]: サービスの web.config ファイルへのパスを指定します。 Visual Studio の外部から FedUtil を実行した場合、または Visual Studio でプロジェクトを開いていない状態で [ツール] メニューから FedUtil を実行した場合は、このフィールドは空の状態で表示されます。 Visual Studio でプロジェクトを右クリックして FedUtil を実行した場合、このフィールドにはそのプロジェクトの web.config ファイルへのパスが既に入力されています。 web.config ファイルが既に存在していて、既定の状態 (つまり、Visual Studio で生成されたままの状態) であることが必要です。 同一の web.config ファイルに対して FedUtil を複数回実行しても、web.config ファイルに追加する内容が上書きされるだけです。

  2. [アプリケーション URI]: ASP.NET サービスの URI を指定します。 これは、.svc ファイルです。 Visual Studio の外部から FedUtil を実行した場合、または Visual Studio でプロジェクトを開いていない状態で [ツール] メニューから FedUtil を実行した場合は、このフィールドは空の状態で表示されます。 Visual Studio でプロジェクトを右クリックして FedUtil を実行した場合、このフィールドにはそのプロジェクトに対応する 2 つの URI が既に入力されています。その一方は localhost を使用し、もう一方はコンピューターの完全修飾ドメイン名を使用します (使用できる場合)。 この URI は、要求に対応するアプリケーションの構成時に領域の値として使用されます。 また、1 つ目の対象ユーザー URI としても使用されます。 対象ユーザー URI を追加するには、手動で指定する必要があります。 URI がセキュリティで保護されていない場合 (つまり "https://" で始まる URI でない場合)、[次へ] をクリックすると警告が表示されます。

情報を入力したら、[次へ] をクリックします。 [Security Token Service] ページが開きます。 [現在のソリューション内に新しい STS プロジェクトを作成する] をクリックします。

e49ab820-73fb-4c19-974b-0c00cb5970f3

Visual Studio の外部から FedUtil を実行した場合、または Visual Studio でプロジェクトを開いていない状態で [ツール] メニューから FedUtil を実行した場合は、[現在のソリューション内に新しい STS プロジェクトを作成する] を使用できません。

[次へ] をクリックします。 [概要] ページが表示されます。

969492e8-73d1-4029-a797-28a77f28f004

[概要] ページには、[アプリケーション情報] ダイアログに入力した情報、新しい STS を作成するように選択したという情報、アプリケーションからの要求、および FedUtil によってアプリケーションの構成に加えられる変更内容が表示されます。

[完了] をクリックします。

web.config ファイルを開くと、FedUtil によって変更されていることを確認できます。

  • 次のアプリケーション設定が追加されます。

    <appSettings> <add key="FederationMetadataLocation" value="C:\inetpub\wwwroot\ClaimsAwareWebSite1_STS\FederationMetadata\2007-06\FederationMetadata.xml" /> </appSettings>
    
  • すべてのユーザーに、フェデレーション メタデータへのアクセス権が付与されます。

    <location path="FederationMetadata"> <system.web> <authorization> <allow users="*" /> </authorization> </system.web> </location>
    
  • WSFederationAuthenticationModule および SessionAuthenticationModule が、<system.Web>/<httpModules> 要素に追加されます。

    <httpModules> ... <add name="WSFederationAuthenticationModule" type="Microsoft.IdentityModel.Web.WSFederationAuthenticationModule, Microsoft.IdentityModel, Version=0.6.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> <add name="SessionAuthenticationModule" type="Microsoft.IdentityModel.Web.SessionAuthenticationModule, Microsoft.IdentityModel, Version=0.6.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> </httpModules>
    
  • これらは、<system.webServer>/<modules> 要素にも追加されます。

    <system.webServer> ... <modules> <add name="WSFederationAuthenticationModule" type="Microsoft.IdentityModel.Web.WSFederationAuthenticationModule, Microsoft.IdentityModel, Version=0.6.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler" /> <add name="SessionAuthenticationModule" type="Microsoft.IdentityModel.Web.SessionAuthenticationModule, Microsoft.IdentityModel, Version=0.6.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler" /> </modules> ... </system.webServer>
    
  • さらに、<microsoft.identityModel>/<service> 要素が次のように変更されます。

    <microsoft.identityModel> <service> <audienceUris> <add value="http://localhost:58496/ClaimsAwareWebSite2/" /> </audienceUris> <federatedAuthentication enabled="true"> <wsFederation passiveRedirectEnabled="true" issuer="http://localhost:58497/ClaimsAwareWebSite2_STS/" realm="http://localhost:58496/ClaimsAwareWebSite2/" requireHttps="false" /> <cookieHandler requireSsl="false" /> </federatedAuthentication> <applicationService> <claimTypeRequired> <claimType type="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" optional="true" /> <claimType type="http://schemas.microsoft.com/ws/2008/06/identity/claims/role" optional="true" /> </claimTypeRequired> </applicationService> <issuerNameRegistry type="Microsoft.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"> <trustedIssuers> <add thumbprint="0E2A9EB75F1AFC321790407FA4B130E0E4E223E2" name="CN=STSTestCert" /> </trustedIssuers> </issuerNameRegistry> </service> </microsoft.identityModel>
    
    • 要求に対応する ASP.NET 証明書利用者アプリケーションの URI を指定する、<audienceUris> 要素が追加されます。

    • 要求に対応する ASP.NET 証明書利用者アプリケーションの STS の場所を指定する、<federatedAuthentication> 要素が追加されます。 ここでは、ローカル STS が使用されています。

    • STS によってアプリケーションに対して発行されるトークンに必要な要求を指定する、<applicationService>/<claimTypeRequired> 要素が追加されます。 ここでは、既定の要求である "name" と "role" が使用されています。 証明書利用者が、実際にこれらの要求の種類の要件に依存するわけではありません。 これらは、次の 2 つの理由から、構成ファイルで指定されます。

      1. 証明書利用者アプリケーションでこれらの要求の種類の要件を使用して、受け取ったトークンにこれらの要求が含まれているかどうかを検証できる。 これは、ClaimsAuthenticationManager で実行できます。

      2. これらの指定により、証明書利用者が、証明書利用者アプリケーションの要求の種類の要件を簡単に更新する方法を提供する。

    • STS が発行するトークンに署名するときに使用する証明書を指定する、<issuerNameRegistry>/<trustedIssuers> 要素が追加されます。 STS は既定の証明書を使用して、生成するトークンに署名します。 この証明書の名前は "STSTestCert" で、STS で使用するために証明書ストアに自動的に追加されます。 証明書ファイルは STS プロジェクト内にあります。 ファイルのパスワードは "STSTest" です。 これは、運用時には使用しないでください。 既定の証明書を任意の他の証明書に変更することができます。 IIS プロセスのユーザーがその証明書の秘密キーにアクセスできることを確認してください。 また、IssuerNameRegistry の派生型を作成して、信頼できる発行者の証明書の検証もプログラムで実行します。

さらに、ソリューション エクスプローラーでは、FedUtil によって、ソリューションに新しいプロジェクトが追加されていることを確認できます。 このプロジェクトはローカル STS です。 また、フェデレーション メタデータ ドキュメントが証明書利用者アプリケーションとローカル STS の両方に追加されています。

0d9713f7-ebf0-4741-8a85-6cb36d99ece2

このローカル STS によって発行されるトークンは暗号化されません。

ローカル STS によって発行される要求を追加するには、App_Code フォルダー内の STS プロジェクトの CustomSecurityTokenService.cs を開き、GetOutputClaimsIdentity メソッドを探して、要求を追加します。

2. 既存の運用 STS の登録

ここでは、ASP.NET 証明書利用者から既存の STS への信頼を確立します。

Visual Studio で、[ファイル] メニューを開き、[新規作成]、[Web サイト] の順に選択します。 要求に対応する ASP.NET Web サイトを選択します。 ソリューション エクスプローラーでプロジェクトを右クリックし、[STS 参照の追加] を選択します。 この操作により、FedUtil ツールが実行されます。 [フェデレーション ユーティリティ ウィザードの開始] ページに表示された [アプリケーション構成の場所] と [アプリケーション URI] が正しいことを確認し、[次へ] をクリックします。

[アプリケーション情報] ページの [既存の STS を使う] をクリックします。

18b594ce-a7da-4ca4-b025-756aa7ed156c

運用 STS のフェデレーション メタデータ エンドポイントの場所を指定する必要があります。 [場所のテスト] をクリックすると、メタデータ ドキュメントにアクセス可能かどうかを確認できます。 このボタンをクリックすると、指定されたエンドポイントに対する要求が実行され、既定の Web ブラウザーにその応答が表示されます。 ここでは、Active Directory® フェデレーション サービス (AD FS) 2.0 STS を使用します。 フェデレーション メタデータ ドキュメントの場所を指定してから [次へ] をクリックします。

ローカルの証明書ストアで信頼されていない証明書を使用する STS を指定すると、"ID1025: 証明書チェーンは処理されましたが、信頼プロバイダーによって信頼されていないルート証明書で強制終了されました。" という警告メッセージが表示されます。 そのまま続行する場合は [はい] をクリックします。 続行しない場合は [いいえ] をクリックし、別の STS を選択します。

別の [アプリケーション情報] ページが表示されます。ここで、[暗号化しない] または [暗号化を有効にする] を選択するよう求められます。

運用 STS でトークンの暗号化がサポートされていることを STS 管理者に確認してください。 サポートされている場合は、暗号化を有効にすることをお勧めします。 ここでは [暗号化を有効にする] をクリックします。 次に、STS でトークンを暗号化するときに使用するように証明書利用者が求める証明書を選択する必要があります。

既定の証明書を使用すると、暗号化するトークンの証明書がローカル STS によって既に作成されている場合は、同じ証明書が暗号化解除のために再び使用されます。 運用 STS ではローカル STS で使用されたものと同じ証明書を使用する可能性が低いため、運用 STS の登録の場合、これはあまり一般的な操作ではありません。 運用ソリューションでは、このオプションを使用しないでください。 サービス証明書が既にある場合は、同じ証明書を使用できます。

既存の証明書を選択する場合、FedUtil によってローカルの証明書ストア内にある証明書が表示されます。 証明書に、秘密キーとサブジェクト名が設定されている必要があります。 アプリケーションを実行する ID (たとえば、NETWORK SERVICE) で、証明書の秘密キーにアクセスできることを確認してください。

ここでは、既定の証明書を使用することも、既存の証明書を選択することもできます。 どちらかを選択したら [次へ] をクリックします。

[提供される要求] ページが表示されます。

b310bfbc-3186-4d81-bacc-913aa80d8a33

ここには、STS によって提供される要求の一覧が示されます。 FedUtil は STS からメタデータをダウンロードし、解析して、この一覧を取得します。 既定では、FedUtil は、証明書利用者の構成で必要な要求として、名前要求と役割要求のみを構成します。 これ以外の要求を必要とする証明書利用者アプリケーションの構成方法については、「How to Configure Your Application to Require Additional Claims (追加の要求を必要とするアプリケーションの構成方法)」を参照してください。 証明書利用者アプリケーションで必要な要求が STS で提供されていない場合は、STS 管理者に連絡して同意を得る必要があります。

[次へ] をクリックします。 [概要] ページが表示されます。

104f1b7c-f19e-43bf-a6aa-9eb4d92f3532

テスト証明書を選択した場合は、アプリケーション情報に "選択されたアプリケーション証明書: サブジェクトの名前が 'CN=DefaultApplicationCertificate' の新しい証明書が個人ストアおよび信頼されている人の証明書ストアに追加されます (この証明書が存在していない場合)。" という文章が含まれています。 既存の証明書を選択した場合は、その証明書の拇印が表示されます。

[概要] ページには、[アプリケーション情報] ダイアログに入力した情報、既存の STS を使用するように選択したという情報、アプリケーションからの要求、および FedUtil によってアプリケーションの構成に加えられる変更内容が表示されます。

また、[概要] ページには、[このアプリケーションのメタデータの更新を毎日実行するようにスケジュールする] というチェック ボックスもあります。 このチェック ボックスをオンにすると、FedUtil によって、アプリケーションのメタデータを毎日真夜中に更新するタスクがスケジュールされます。 詳細については「FedUtil を使用する信頼管理の実行方法」を参照してください。

[完了] をクリックします。

証明書利用者の web.config ファイルに加えられる変更内容は次のとおりです。

  • 次のアプリケーション設定が追加されます。 "specified STS" は FedUtil で指定した STS を表します。

    <appSettings> <add key="FederationMetadataLocation" value="<specified STS>" /> </appSettings>
    
  • すべてのユーザーに、フェデレーション メタデータへのアクセス権が付与されます。

    <location path="FederationMetadata"> <system.web> <authorization> <allow users="*" /> </authorization> </system.web> </location>
    
  • WSFederationAuthenticationModule および SessionAuthenticationModule が、<system.Web>/<httpModules> 要素に追加されます。

    <httpModules> ... <add name="WSFederationAuthenticationModule" type="Microsoft.IdentityModel.Web.WSFederationAuthenticationModule, Microsoft.IdentityModel, Version=0.6.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> <add name="SessionAuthenticationModule" type="Microsoft.IdentityModel.Web.SessionAuthenticationModule, Microsoft.IdentityModel, Version=0.6.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> </httpModules>
    
  • これらは、<system.webServer>/<modules> 要素にも追加されます。

    <system.webServer> ... <modules> <add name="WSFederationAuthenticationModule" type="Microsoft.IdentityModel.Web.WSFederationAuthenticationModule, Microsoft.IdentityModel, Version=0.6.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler" /> <add name="SessionAuthenticationModule" type="Microsoft.IdentityModel.Web.SessionAuthenticationModule, Microsoft.IdentityModel, Version=0.6.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler" /> </modules> ... </system.webServer>
    
  • さらに、<microsoft.identityModel>/<service> 要素が次のように変更されます。 "specified STS" は FedUtil で指定した STS を表します。

    <microsoft.identityModel> <service> <audienceUris> <add value="http://localhost:57349/ClaimsAwareWebSite2/" /> </audienceUris> <federatedAuthentication> <wsFederation passiveRedirectEnabled="true" issuer="https://<specified STS>/FederationPassive/" realm="http://localhost:57349/ClaimsAwareWebSite2/" requireHttps="false" /> <cookieHandler requireSsl="false" /> </federatedAuthentication> <serviceCertificate> <certificateReference x509FindType="FindByThumbprint" findValue="48BF03FCEDA703DE09E0F1F0CEFED60BB92B3DD8" storeLocation="LocalMachine" storeName="My" /> </serviceCertificate> <applicationService> <claimTypeRequired> <!--Following are the claims offered by STS 'http://<specified STS>/Trust'. Add or uncomment claims that you require by your application and then update the federation metadata of this application.--> <claimType type="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" optional="true" /> <claimType type="http://schemas.microsoft.com/ws/2008/06/identity/claims/role" optional="true" /> <!--<claimType type="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress" optional="true" />--> <!--<claimType type="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn" optional="true" />--> <!--<claimType type="http://schemas.xmlsoap.org/claims/CommonName" optional="true" />--> <!--<claimType type="http://schemas.xmlsoap.org/claims/EmailAddress" optional="true" />--> <!--<claimType type="http://schemas.xmlsoap.org/claims/Group" optional="true" />--> <!--<claimType type="http://schemas.xmlsoap.org/claims/UPN" optional="true" />--> <!--<claimType type="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier" optional="true" />--> <!--<claimType type="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/webpage" optional="true" />--> <!--<claimType type="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/title" optional="true" />--> <!--<claimType type="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/picture" optional="true" />--> <!--<claimType type="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/manager" optional="true" />--> <!--<claimType type="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/department" optional="true" />--> </claimTypeRequired> </applicationService> <issuerNameRegistry type="Microsoft.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"> <trustedIssuers> <add thumbprint="5C8885A8E3D29D6BF6C9365E00B1BEA5EB284D1E" name="CN=<specified STS>, OU=US-Federated Identity, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" /> </trustedIssuers> </issuerNameRegistry> </service> </microsoft.identityModel>
    
    • 要求に対応する ASP.NET 証明書利用者アプリケーションの URI を指定する、<audienceUris> 要素が追加されます。

    • 要求に対応する ASP.NET 証明書利用者アプリケーションの STS の場所を指定する、<federatedAuthentication> 要素が追加されます。 これは FedUtil で指定した STS です。

    • 要求に対応する ASP.NET 証明書利用者アプリケーションが STS との通信の暗号化に使用する証明書の場所を指定する、<serviceCertificate> 要素が追加されます。 これは FedUtil で指定した証明書です。

    • STS によってアプリケーションに対して発行されるトークンに必要な要求を指定する、<applicationService>/<claimTypeRequired> 要素が追加されます。 既定では、FedUtil は、要求に対応する ASP.NET 証明書利用者アプリケーションで名前要求と役割要求のみが必要となるように構成します。 これ以外の要求を必要とする証明書利用者アプリケーションの構成方法については、「How to Configure Your Application to Require Additional Claims (追加の要求を必要とするアプリケーションの構成方法)」を参照してください。

    • STS が発行するトークンに署名するときに使用する証明書を指定する、<issuerNameRegistry>/<trustedIssuers> 要素が追加されます。

FedUtil を繰り返し実行して、ローカル STS から運用 STS への切り替えと運用 STS からローカル STS への切り替えを行うことができます。 FedUtil を実行するたびに、以前に作成された構成が上書きされます。 ただし、FedUtil を使用して、ローカル STS または運用 STS を使用している状態から STS を使用しない状態に切り替えることはできません。

また、FedUtil を実行してローカル STS を作成し、その後に運用 STS へ切り替えると、構成ファイルの <issuerNameRegistry> 要素に 2 つの信頼できる発行者が設定されます。 一方がローカル STS、もう一方が運用 STS です。 アプリケーションを展開する準備が整ったら、発行者名レジストリからローカル STS を削除する必要があります。

3. フェデレーション メタデータの更新

既定では、FedUtil を使用して運用 STS を指定すると、FedUtil はアプリケーションで名前要求と役割要求のみが必要となるように構成します。 これは、アプリケーションの web.config ファイルの <Microsoft.IdentityModel>/<service>/<applicationService>/<claimTypeRequired> 要素を見ることで確認できます。

<claimTypeRequired> <!--Following are the claims offered by STS '<specified STS>', and added at 4/15/2009 3:57:07 PM. Add or uncomment claims that you require by your application and then update the federation metadata of this application.--> <claimType type="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" optional="true" /> <claimType type="http://schemas.microsoft.com/ws/2008/06/identity/claims/role" optional="true" /> <!--<claimType type="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress" optional="true" />--> ... </claimTypeRequired>

たとえば、上のコード スニペットでは emailaddress 要求がコメント アウトされています。 アプリケーションで必要となる要求を追加して構成するには、必要な要求のコメントを解除します。 次に、ソリューション エクスプローラーでアプリケーション プロジェクトを右クリックし、[フェデレーション メタデータの更新] を選択します。

14597f95-c206-4df5-bb01-36f677bb8bf5

FedUtil によってアプリケーションのフェデレーション メタデータが更新され、必要な要求の一覧に変更が反映されます。 後でアプリケーションの FederationMetadata.xml ファイルを開き、必要な要求の一覧が更新されていることを確認します。 このとき、アプリケーションの web.config ファイルでコメントを解除した要求が追加されているはずです。 FedUtil では、アプリケーションの web.config ファイルのバックアップ コピーを作成することもできます。

<fed:ClaimTypesRequested> <auth:ClaimType Uri="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" Optional="True" xmlns:auth="http://docs.oasis-open.org/wsfed/authorization/200706" /> <auth:ClaimType Uri="http://schemas.microsoft.com/ws/2008/06/identity/claims/role" Optional="True" xmlns:auth="http://docs.oasis-open.org/wsfed/authorization/200706" /> ... </fed:ClaimTypesRequested>

また、カスタム要求の種類をアプリケーションの web.config ファイルに追加することもできます。 この場合は、新しい要求の種類が発行されるようにアプリケーションに対応する STS ポリシーを更新するよう、STS 管理者に求める必要があります。