从其他wcf服务调用wcf服务时传递Windows凭据

时间:2011-05-06 11:45:11

标签: c# wcf wcf-security

我有以下问题:

我有两个WCF服务都使用basicHttpBinging定义为:

    <binding name="DefaultBasicBinding" closeTimeout="01:00:00" openTimeout="01:00:00"
      receiveTimeout="01:00:00" sendTimeout="01:00:00" maxReceivedMessageSize="2147483647">
      <readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647" />
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows"/>
      </security>
    </binding>

在web.config中我也有这些行:

< authentication mode="Windows"/>
< serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />

然后我有Silverlight应用程序调用ServiceNo1。 在服务器端,执行服务方法。在她的身体中,ServiceNo1和ServiceNo2被调用为客户端。

ServiceNo1 client1 = new ServiceNo1();
client1.ExecuteNextMethod1();


ServiceNo2 client2 = new ServiceNo2();
client2.ExecuteNextMethod2();    

这完美适用于locahost。当这个在dev上发布时 - 问题就开始了。

当在silverlight应用程序调用的方法中执行服务方法时,抛出异常:

Exception type: 
System.ServiceModel.Security.MessageSecurityException  

Message: 
The HTTP request is unauthorized with client authentication scheme 'Negotiate'. 
The authentication header received from the server was 'Negotiate,NTLM'. 

看起来好像没有传递Windows凭据。

上面列出的设置也在dev上。两个服务器(localhost&amp; dev)都在IIS上设置了“仅Windows身份验证”。

有人帮不了我?

1 个答案:

答案 0 :(得分:0)

最有可能的是,在localhost上,您的网络服务器在您的凭据下运行。在Dev服务器上,Web服务器将在不同的服务帐户下运行(例如,应用程序的IIS应用程序池服务)。

您最好的解决方案是获取您的应用程序在第二项服务授权下运行的服务帐户。

还有其他选择 - 使用您的用户凭据作为开发中的服务帐户(我假设这不是受控环境中的选项),或者在服务器端模拟您的凭据(再次 - 这不太可能是合适的在受控制的环境中)。

修改 您最好的选择可能是冒充用户的凭据。请参阅此MSDN article以了解实施情况。我对Silverlight不太熟悉,但你应该可以做类似的事情:

using System.Security.Principal;

------------------------

WindowsImpersonationContext impersonationContext;
impersonationContext = 
    ((.WindowsIdentity)HttpContext.User.Identity).Impersonate();

//Call your service here.

impersonationContext.Undo();

请注意,您可能会遇到Double-Hop问题,其中Windows不允许您将用户凭据从一台服务器传递到下一台服务器 - 我会阅读链接的文章了解背景信息。