2011-08-12 12 views
0

WCFのなりすましに関する質問があります。私は、クライアントアプリケーションによって呼び出されるWCF Windowsサービス上のDBに接続したいと思います。 DBへの接続は、サービスを実行するアカウントを使用して行う必要があります。しかし、WCFサービスへの呼び出しが信頼できるソースから行われたことを検証したいと思います(クライアントアプリケーションのユーザーがドメインの自認ユーザーであることを確認してください)。WCF WindowsサービスDBの接続となりすましに関する質問

私が使用を勧める種類のセキュリティは何ですか?

私が偽装を試みたが、WindowsサービスからDBに接続しようとしたとき、私はこのエラーを取得:

System.Data.SqlClient.SqlException:ユーザーのログインに失敗しました「NT AUTHORITY \ ANONYMOUS LOGON」 。

構成文字列は、このようなものです:

サーバー= myServerという;初期カタログ= MYDATABASE; = Trueの

統合セキュリティサービスのWCF構成は次のようになります。

<system.serviceModel> 
<services> 
    <service name="MyNamespace.MyService" 
      behaviorConfiguration="TransfertServiceBehavior"> 
    <host> 
     <baseAddresses> 
     <add baseAddress="net.tcp://localhost:8095/MyNamespace.MyService"/> 
     </baseAddresses> 
    </host> 
    <endpoint address="" 
       binding="netTcpBinding" 
       bindingConfiguration="TransactionalBinding" 
       contract="myContract" /> 
    <endpoint address="mex" 
       binding="mexTcpBinding" 
       contract="IMetadataExchange" /> 
    </service> 
</services> 

<bindings> 
    <netTcpBinding> 
    <binding name="TransactionalBinding" 
      transferMode="Streamed" transactionFlow="true" maxReceivedMessageSize="1000000000"> 
     <readerQuotas maxDepth="10000" maxStringContentLength="1000000000" 
       maxArrayLength="1000000000" maxBytesPerRead="10000" maxNameTableCharCount="10000" /> 
     <security mode="Transport" /> 
    </binding> 

    </netTcpBinding> 
</bindings> 

<behaviors> 
    <serviceBehaviors> 
    <behavior name="TransfertServiceBehavior"> 
     <serviceMetadata httpGetEnabled="False"/> 
     <serviceDebug includeExceptionDetailInFaults="false"/> 
     <serviceAuthorization impersonateCallerForAllOperations="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

クライアントアプリの設定は次のようになります。

<system.serviceModel> 
<bindings> 
    <netTcpBinding> 
    <binding name="NetTcpBinding_Client" closeTimeout="00:01:00" 
     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
     transactionFlow="true" transferMode="Streamed" transactionProtocol="OleTransactions" 
     hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="1000000000" 
     maxBufferSize="1000000000" maxConnections="10" maxReceivedMessageSize="65536"> 
     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="1000000000" 
     maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     <reliableSession ordered="true" inactivityTimeout="00:10:00" 
     enabled="false" /> 
     <security mode="Transport"> 
     <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" /> 
     <message clientCredentialType="Windows" /> 
     </security> 
    </binding> 
    </netTcpBinding> 
</bindings> 
<client> 

    <endpoint address="net.tcp://localhost:8095/MyNamespace.MyService" 
    binding="netTcpBinding" bindingConfiguration="NetTcpBinding_Client" 
    contract="myContract" behaviorConfiguration="ImpersonationBehavior"> 
    <identity> 
     <userPrincipalName value="[email protected]" /> 
    </identity> 
    </endpoint> 
</client> 

<behaviors> 
    <endpointBehaviors> 
    <behavior name="ImpersonationBehavior"> 
     <clientCredentials> 
     <windows allowedImpersonationLevel="Impersonation" /> 
     </clientCredentials> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 

答えて

2

WCFが偽装する場合、WCFアカウントサービスの場合はKerberos Constrained Delegationを有効にする必要があります。Delegation and Impersonation with WCFも参照してください。 Configure the WCF Service Identity Trusted for Constrained Delegation

詳細な手順:ドメインコントローラで

  • 、Microsoft管理コンソール (MMC)のActive Directoryユーザーとコンピュータスナップインを起動します。
  • MMCスナップインの左側のウィンドウで、[コンピュータ]ノードをクリックします。
  • 右ペインで、WCFサーバーコンピュータをダブルクリックして、 プロパティダイアログボックスを表示します。
  • WCFサーバーの[プロパティ]ウィンドウの[委任]タブ コンピュータで、委任のためにコンピュータを信頼しないで、 が選択されています。制限付きの委任を使用するには、指定したサービスへの委任のみ に対してこのコンピュータを信頼するを選択します。下側のペインでは、 のサービスまたはサービスにアクセスできるかどうかを正確に指定します。
  • の下に指定されたサービスへの委任のためにこのコンピュータを信頼する のみ、デフォルトのオプションを使用するKerberosのみが選択されています。
  • [追加]ボタンをクリックして、[サービスの追加]ダイアログボックスを表示します。
  • [ユーザーまたはコンピューター]ボタンをクリックします。
  • [ユーザーまたはコンピュータの選択]ダイアログボックスで、SQL Serverをシステムまたは ネットワークサービスとして実行している場合は、 データベースサーバーコンピュータの名前を入力します。

    また、カスタム ドメインアカウントを使用してSQL Serverを実行している場合は、代わりにそのアカウント名を入力して[OK]をクリックします。 選択したユーザー用に構成されたすべてのSPNまたは コンピュータアカウントが表示されます。 SQL Serverへのアクセスを制限するには、 MSSQLSvcサービスを選択し、[OK]をクリックします。

+0

ありがとう!それは非常に役に立ちます。これは私が推測する最高のセキュリティのためにそれを行う方法です。 –

1

は、あなたのサービスの設定からこの行を削除します。

<serviceAuthorization impersonateCallerForAllOperations="true" /> 

と、このクライアントからの設定:

<behaviors> 
    <endpointBehaviors> 
    <behavior name="ImpersonationBehavior"> 
     <clientCredentials> 
     <windows allowedImpersonationLevel="Impersonation" /> 
     </clientCredentials> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 

偽装とは、すべての操作が実行されることを意味します。偽装されたユーザのヒンジ・コンテキスト=サービスのアイデンティティは、発呼ユーザのアイデンティティに置き換えられる。 SQLサービスが実行されているマシンにSQL Serverがローカルにインストールされている場合、データベースへの呼び出しも同様に偽装されます。

偽装を無効にすると、サービスでの実行でサービスアカウントが使用されますが、サービスは呼び出し元の各クライアントを認証するため、必要なものを正確に取得できます。これは、Windows統合認証でトランスポートセキュリティを使用するnetTcpBinding構成によって行われます。

+0

私は –

+0

ちょうどそれを明確にするために、最初のサービスコールがうまく機能...それを試してみましたが、「不正アクセス」エラーを受け取りました。しかし、このサービス自体が2番目のWCFリモートサービスを呼び出し、2番目の呼び出しでこのエラーが発生しています。 –

関連する問題