Windows 2008 (IIS 7.5) マシンに (データベースにアクセスする) WCF サービスがあり、WebClient (REST/webHttpBinding を介して GET 呼び出しを使用) を介して Excel (VSTO - Excel クライアントは内部ネットワークに常駐) から呼び出されます。
ユーザーの資格情報を WCF サービスに渡したいのですが、サービス内のメソッドで、Excel が開始されたワークステーションにログオンしているユーザーとしてデータベースにアクセスしたいのですが、401 (未承認) が返されます。
私が持っているクライアントで(「ベース」は、私のクラスが継承する WebClient クラスを指すことに注意してください):-
base.Credentials = CredentialCache.DefaultCredentials;
base.OpenReadCompleted += new OpenReadCompletedEventHandler(ReadJsonStringAsyncComplete);
base.OpenReadAsync(new Uri(address));
私が持っているサービス内: -
[OperationContract]
[WebInvoke(Method = "GET", UriTemplate = "/GetSomeData", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
SomeDataClass GetSomeData();
サービス構成:-
<service name="zzzz.Service.xxxx.xxxx" behaviorConfiguration="DataExtractBehavior">
<endpoint address="" binding="webHttpBinding" bindingConfiguration="DataExtractBinding" behaviorConfiguration="MyEndpointBehavior" contract="zzzz.Service.xxxx.Ixxxx">
</endpoint>
</service>
...
<serviceBehaviors>
<behavior name="DataExtractBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<etwTracking profileName="EndToEndMonitoring Tracking Profile" />
</behavior>
</serviceBehaviors>
...
<webHttpBinding>
<binding name="DataExtractBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" ></transport>
</security>
</binding>
</webHttpBinding>
</bindings>
...
ConnectionString に含まれるもの"integrated security=SSPI"
ノート:
- 単純に文字列を返すダミー メソッドを呼び出すと (データベース呼び出しはありません)、成功した応答が返されます (問題はありません)。
- (トレースを通じて)私が見ることができる限り、WCFサービス内では、データベース呼び出しでフォールオーバーしています(おそらく、データベースでログオン/認証できないため)
- また、WCF メソッド内では ServiceSecurityContext.Current.WindowsIdentity が null のようです
- サービスがワークステーションでホストされている場合 (データベースのローカル インスタンスに接続している場合)、サービス内のメソッドにアクセスできます。同じ特権を持っていない開発マシンにデプロイすると問題が発生します。
- NetworkCredentials を試しました (デフォルトおよびハードコードされた userIs/password/domain)
- 私はWindows認証とASP.NET認証を有効にしています(Anon/ASP.NET/nothing-elseでWindows認証だけを試しましたが、結果はまちまちでした-異なるリターンコードだけでは成功しませんでした)
- 偽装は現在設定されていませんが、trueに設定してみました(500を受け取りました)
上記のシナリオでユーザーの資格情報を正常に送信する方法を知っている人はいますか (したがって、HTTP 401 問題を解決します)。
よろしく
トラビス