Kerberos で実行することを目的とした WCF サービスをセットアップしました。私が抱えている問題は、サービスからクライアントに例外をスローするたびに、例外の詳細を個別に要求しているように見え、「相互認証の要件がリモートサーバーによって満たされませんでした. ' .
良いニュース - 例外をスローしないサービス呼び出しへの要求は正常に機能します。
私の現在のフォールバックは、削除したい NTLM を許可することです。「Kerberos は常に難しい」という考え方を克服しようとして、問題の核心を理解したいと思います。
基本的なネットワークの詳細:
- SPN は、NetBios + FQDN 名、およびアプリケーション プールのサービス アカウントに対して、サービスに登録されます。(http マシン SPN へのフォールバックは利用できません。
- 匿名は無効です
試行された例外の種類:
- 元の例外の再スロー (クライアントは基本的な例外タイプにアクセスできます)
FaultException、(意図されている可能性があるカスタム例外は必要ありませんが)+各Webサービスメソッドに次を追加します。
[FaultContract(typeof(FaultException))]
クライアント側の詳細
ClientCredential の設定: (クライアント)
credentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;
credentials.Windows.AllowNtlm = false; // Set to true to allow it to work;
credentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Delegation;
以前の問題からのその他の修正:
この質問のおかげでSpnEndpointIdentityセット
SpnEndpointIdentity spnEndpointIdentity = new SpnEndpointIdentity("");
var address = new EndpointAddress(EndpointName, spnEndpointIdentity)
407 プロキシ エラーを停止するには:
BasicHttpBinding.UseDefaultWebProxy = false;
クライアントが受け取った例外: (省略されたスタック トレース)
( ProcessGetResponseWebException呼び出しが例外の詳細を取得しようとしていることを示しているようです)
System.ServiceModel.CommunicationException was unhandled
Message=An error (The request was canceled) occurred while transmitting data over the HTTP channel.
StackTrace:
at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at Project.IMetadataManagement.GetMetadata(String identifier)
InnerException: System.Net.WebException
InnerException: System.Net.ProtocolViolationException
Message=The requirement for mutual authentication was not met by the remote server.
サーバー側の詳細
Web 構成で:
includeExceptionDetailInFaultsは true
<behavior name="Project.MetadataBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
バインディング:
<bindings>
<basicHttpBinding>
<binding name="BasicHttpEndpointBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" />
</security>
</binding>
</basicHttpBinding>
</bindings>
Windows 認証設定
<system.webServer>
<security>
<authentication>
<windowsAuthentication enabled="true" useKernelMode="true" useAppPoolCredentials="true" >
<providers>
<clear />
<add value="Negotiate" />
<add value="NTLM" />
</providers>
<extendedProtection tokenChecking="None" />
</windowsAuthentication>
<anonymousAuthentication enabled="false" />
</authentication>
</security>
</system.webServer>
サービス例
<services>
<service behaviorConfiguration="Project.MetadataBehavior" name="Project.MetadataManagement">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpEndpointBinding" contract="Project.IMetadataManagement">
</endpoint>
</service>
ありとあらゆる助けをいただければ幸いです。私は実際のプロジェクトの名前空間を白紙にしました。
ありがとう。