4

我在 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 问题)。

问候
特拉维斯

4

0 回答 0