2

WIF ベースの WCF サービスが機能するには、メソッドFederatedServiceCredentials.ConfigureServiceHost()を呼び出すか、同等の要素<federatedServiceHostConfiguration>web.configファイルに配置する必要があります。これはサービス レベルの設定です。つまり、すべてのエンドポイントに適用されます。

メソッドのドキュメントによると、ServiceHostBaseインスタンスはいくつかの WIF 固有の方法で変更されます。たとえば、承認は WIF ベースの承認クラスに置き換えられます。

ここで、1 つのエンドポイントが WIF ベースで、他のエンドポイントがプレーンな Windows 認証を使用している複数のを含む単一の<service>(内部<system.serviceModel><services>) を使用したいと考えています。<endpoint>

アップデート。以下の回答 に応えて、 WIF エンドポイントと非 WIF エンドポイントを混在させたい理由を説明させてください。WIF のみを使用する場合、各顧客は AD FS などの STS を必要とします。これを設定することは難しくありませんが、ソフトウェアをテストしたいだけの場合は特に、ハードルが高くなります。そのため、Windows 統合認証を使用するモード (Web サービスとフロント エンド) でインストールし、後で AD FS を使用するモードに切り替えることができます。

したがって、基本的には、AD FS なしでインストールできるようにして、アプリケーションの参入障壁を下げたいと考えています。

これを行うには、 が<service>必要<federatedServiceHostConfiguration>です。ただし、これが私の問題です。これは、同じサービスの非 WIF エンドポイントにも影響します。たとえば、WIF 承認マネージャー ( classClaimsAuthorizationManagerのインスタンス) を突然使用します。

だから私の質問は: 単一の WCF で WIF エンドポイントと非 WIF エンドポイントを混在させるための推奨される方法は何<service>ですか?

4

2 に答える 2

2

WIF の使用と STS の使用を混同している可能性があります。それらは関連していません。

WS2007FederationHttpBinding により、WCF エンドポイントは (STS から) 発行されたトークンを期待するようになります。WS2007HttpBinding または NetTcpBinding には、Windows トークンが必要な場合があります。

WIF を使用して両方を処理できます。実際、WITH WIF を使用すると、2 つの異なるトークン形式をより効果的にサポートするサービス動作を実現できます。

発行されたトークン エンドポイントは、WIF 構成の saml11/saml2 セキュリティ トークン ハンドラーの構成に依存してトークンを処理し、信頼された発行者セクションでそのトークンの信頼を確立します。Windows エンドポイントは、Windows セキュリティ トークン ハンドラーの 1 つに依存して Windows トークンを処理します。

どちらも WIF サービスの authz マネージャーを通過しますが、ウィンドウまたは発行されたトークンのクレームをハイドレートします。claimAUthenticationManager を使用して、これらのクレームを変換してから、claimsauthorizationmanager に到達してアクセスを承認できます。

この猫の皮を剥ぐ方法はたくさんありますが、それは間違いなく可能です。

于 2011-08-06T21:41:55.923 に答える
2

私はあなたができるとは思わない。ただし、あなたの状況では、複数の資格情報のサポートを STS に任せる WIF エンドポイントは 1 つだけにする必要があります。

STS に複数のエンドポイントを配置して、さまざまな種類の認証を処理できます。1 つは Windows 用、もう 1 つはユーザー名/パスワード用などです。

私は昨年、これを実証するコード キャンプ オズ セッションを行いました。ソースは、私のブログ投稿http://www.neovolve.com/post/2010/11/21/CodeCampOz-Not-a-WIF-of-federation.aspxに添付されています。NotAWif Demo\4 - Identity Delegation\NotAWif.DelegationSTSの web.config を見てください。

<system.serviceModel>
  <services>
    <service behaviorConfiguration="ServiceBehavior"
                    name="Microsoft.IdentityModel.Protocols.WSTrust.WSTrustServiceContract">

      <endpoint address="UserName/IWSTrust13"
                        binding="ws2007HttpBinding"
                        bindingConfiguration="ws2007HttpBindingUserNameConfiguration"
                        contract="Microsoft.IdentityModel.Protocols.WSTrust.IWSTrust13SyncContract" />

      <endpoint address="Windows/IWSTrust13"
                binding="ws2007HttpBinding"
                bindingConfiguration="ws2007HttpBindingWindowsConfiguration"
                contract="Microsoft.IdentityModel.Protocols.WSTrust.IWSTrust13SyncContract" />

      <endpoint address="mex"
                        binding="mexHttpsBinding"
                        contract="IMetadataExchange" />
      <host>
        <baseAddresses>
          <add baseAddress="https://localhost/NotAWif.DelegationSTS/Service.svc" />
        </baseAddresses>
      </host>
    </service>
  </services>
  <bindings>
    <ws2007HttpBinding>
      <binding name="ws2007HttpBindingUserNameConfiguration">
        <security mode="TransportWithMessageCredential">
          <transport clientCredentialType="None">
            <extendedProtectionPolicy policyEnforcement="Never" />
          </transport>
          <message clientCredentialType="UserName"
                                establishSecurityContext="false" />
        </security>
      </binding>
      <binding name="ws2007HttpBindingWindowsConfiguration">
        <security mode="TransportWithMessageCredential">
          <transport clientCredentialType="None">
            <extendedProtectionPolicy policyEnforcement="Never" />
          </transport>
          <message clientCredentialType="Windows"
                                establishSecurityContext="false" />
        </security>
      </binding>
    </ws2007HttpBinding>
  </bindings>
  <behaviors>
    <serviceBehaviors>
      <behavior name="ServiceBehavior">
        <serviceMetadata httpGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="false" />
        <serviceCredentials>
          <serviceCertificate findValue="DefaultApplicationCertificate"
                                          x509FindType="FindBySubjectName" />
        </serviceCredentials>
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

これは、複数の種類の認証をサポートするように STS を構成した方法です。RP は、クレーム |WindowsIdentity ではなく、クレームのみを処理する必要があります。特定の種類の認証を、RP が使用するクレームのセットに変換するのは、STS の役割です。

于 2011-06-08T23:22:30.060 に答える