1)マシンA上-WCFサービスを作成し、それをホストしましたIIS 5.1、このURLで実行されているMachineA。http://mydomain/SetupPOCService/Service1.svc
2)マシンB上-Asp.netWebアプリケーションを作成しました。このアプリケーションでは、以前に作成したWCFサービスを利用しようとしましたが、現在は別のm/c、つまりMachineAでホストされています。このWebアプリケーションをVisualStudio環境から実行すると、そのMachineAのWCFサービスにアクセスし、データを取得します。
---ここまで罰金---
3)マシンB上-IIS5.1でWebアプリケーションをホストしました。このWebアプリケーションはここでは正常に動作していますが、MachineAのWCFサービスにアクセスできず、この種のエラーが発生します。
リモートサーバーがエラーを返しました:(401)Unauthorized。
StackTrace [MessageSecurityException:HTTP要求はクライアント認証スキーム 'Negotiate'で許可されていません。サーバーから受信した認証ヘッダーは 'Negotiate、NTLM'でした。]
私はたくさんのことを試しましたが、それは役に立ちました。ご意見をお聞かせください...
以下はクライアント用のWeb.Configです
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
以下はサーバー用のWeb.Configです
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
IISに移動します。 「基本設定」と呼ばれるものがあります。アクセス許可とマシンのアクセス許可を追加します。ネットワーク内の一部の境界へのアクセスが許可されていない可能性があります。
また、ClientCredentialType=Windows
は認証ヘッダーをNegotiate
にしますが、これはNegotiate, NTLM
と連携するには十分ではありません。
ただし、client.ClientCredentials.Windows.AllowNTLM = True
を設定すると、必要なNTLMが認証ヘッダーに追加され、機能します。
また、万が一の場合に備えて、VSを管理者として実行してみてください。 :)
私の解決策は、ClientCredentialType="Ntlm"
を設定することです。