2011-09-09 12 views
1

.Net 3.5を使用していて、WCFサービスを設定しようとしていて、例外を受け取りました。クライアント認証スキーム 'Negotiate'でHTTPリクエストが不正です。サーバーから受信した認証ヘッダーは 'Negotiate、NTLM'でした。下記のサーバー側とクライアント側の.configファイルを添付しました。
ちょうど2ノート。アプリケーションとサービスは、ネットワークアクセス要件のために偽装を使用しています。 Webアプリケーションは、WCFサービスとは異なるサーバー上に存在します。両方とも、それぞれのweb.configファイルで次のように指定されています。WCF認証方式が一致していませんか?

<authentication mode="Windows"/> 
<identity impersonate="true" userName="userName" password="password"/> 

(Server1の)Webアプリケーション

<system.serviceModel> 
<bindings> 
    <basicHttpBinding> 
    <binding name="BasicHttpBinding_IReports" closeTimeout="00:01:00" 
    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
    useDefaultWebProxy="false" proxyAddress="http://server2/Services/ReportService"> 
     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
     maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" /> 
     <message clientCredentialType="UserName" algorithmSuite="Default" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<client> 
    <endpoint name="BasicHttpBinding_IReports" address="http://server2/Services/ReportService/Reports.svc" 
    binding="basicHttpBinding" contract="WCFServiceRef.IReports" bindingConfiguration="BasicHttpBinding_IReports" 
      behaviorConfiguration="ClientBehavior"/> 
</client> 
<behaviors> 
    <endpointBehaviors> 
    <behavior name="ClientBehavior" > 
     <clientCredentials supportInteractive="true" > 
     <windows allowedImpersonationLevel="Impersonation" allowNtlm="true" /> 
     </clientCredentials> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 
</system.serviceModel> 

WCFサービス(server2の上)

<system.serviceModel> 
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
<bindings> 
    <basicHttpBinding> 
    <binding name="default" maxReceivedMessageSize="200000"> 
     <readerQuotas maxStringContentLength="200000" maxArrayLength="200000"/> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" /> 
     <message clientCredentialType="UserName" algorithmSuite="Default" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<services> 
    <service behaviorConfiguration="ReportService.ReportsBehavior" name="ReportService.Reports"> 
    <endpoint address="" binding="basicHttpBinding" contract="ReportService.IReports" bindingConfiguration="default"> 
     <identity> 
     <dns value="localhost"/> 
     </identity> 
    </endpoint> 
    <endpoint name="mex" address="mex" binding="basicHttpBinding" contract="IMetadataExchange" bindingConfiguration="default"/> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="ReportService.ReportsBehavior"> 
     <serviceAuthorization impersonateCallerForAllOperations="false"/> 
     <serviceMetadata httpGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="false"/> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
</system.serviceModel> 

私は、これがあろうと、アプリケーションでallowNtlm="true"ディレクティブを適用した場合と思いました固定する。サーバーはWindows認証を期待していますが、受信していないようです。異なるサーバーにあるアプリケーションとサービスのために、私はプロキシの値を使用する必要がありますか?私は何か基本的なことは理解していないが、それがサーバー側のIIS構成にあるのか、それとも私のアプリケーションにあるのかはわからないと思う。 助けてくれてありがとう!

答えて

1

このsample from MSDN for basicHttpBinding with TransportCredentialOnlyは、セットアップ方法を示しています。設定はメッセージレベルのセキュリティも設定されていることを除いて、非常に似ています。私はそれが問題の原因であるかどうかを見るためにconfigからメッセージ要素を削除しようとします。

私は問題が偽装資格情報自体を渡すのではなく、TransportCredentialOnly構成と考えています。また、IISがWCFサーバー上でWindows認証をサポートするように構成されていることを確認してください。

+0

私はあなたが提供したリンクを見ていきますが、私は*多くの*バリエーションの設定を試しました。私は私の最初の構成はメッセージの指示を持っていないと思う。私はサーバーオペレーショングループと話し、IISがWindows認証をサポートするように構成されていることを確認しました。 – McArthey

+0

あなたが提供したリンクに重要なメモがありました。 WCFサービスのWeb参照をクライアントアプリケーションに追加するこのHow Toアーティクルでは、Web参照を使用してWCFサービスの使用状況を従来のWebサービスとして示し、それ以外の場合はサービス参照として追加できます。 "これは私のためのトリックかもしれないように見えます。特に理由はありますが、わかりません。 – McArthey

関連する問題