我在 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 似乎为空
- 当服务托管在我的工作站上时,我可以访问服务中的方法(连接到数据库的本地实例):当我部署到我没有相同权限的开发机器时出现问题
- 我已经尝试过 NetworkCredentials(默认和硬编码的 userIs/password/domain)
- 我启用了 Windows 身份验证和 ASP.NET 身份验证(我仅尝试使用 Anon/ASP.NET/nothing-else 进行 Windows 身份验证,但结果不一 - 从未成功,只是返回代码不同)
- 模拟当前未设置,但我已尝试将其设置为 true(收到 500)
有谁知道如何在上述情况下成功发送用户的凭据(从而解决 HTTP 401 问题)。
问候
特拉维斯