将Windows身份传递给WCF从ASP.NET

问题描述:

我有一个WCF服务托管在IIS中,启用了集成的Windows身份验证并禁用了匿名身份验证。当我尝试从ASP.NET调用此服务时,出现以下MessageSecurityException:将Windows身份传递给WCF从ASP.NET

“HTTP请求未经授权,客户端身份验证方案'Negotiate'。从服务器收到的身份验证头是'Negotiate,NTLM ']“

任何想法?

这是我的服务配置:

<system.serviceModel> 
<bindings> 
    <basicHttpBinding> 
    <binding name="CalculatorServiceBasicHttpBinding"> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Windows" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<services> 
    <service name="Service.CalculatorService" 
      behaviorConfiguration="CalculatorServiceBehavior"> 
    <endpoint name="BasicHttpEndpoint" 
       address="" 
       binding="basicHttpBinding" 
       bindingConfiguration="CalculatorServiceBasicHttpBinding" 
       contract="Framework.ICalculatorService"> 
    </endpoint> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="CalculatorServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
</system.serviceModel> 

这是我如何调用该服务:

var basicHttpBinding = new BasicHttpBinding(); 
basicHttpBinding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly; 
basicHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows; 
var factory = new ChannelFactory<Framework.ICalculatorService>(basicHttpBinding, new EndpointAddress("http://localhost/CalculatorService/CalculatorService.svc")); 
factory.Credentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials; 
var proxy = factory.CreateChannel(); 
var emailAddress = proxy.GetMyEmailAddress(); 
((ICommunicationObject)proxy).Close(); 
factory.Close(); 

你的WCF配置适用于我,所以最有可能你没有IIS配置正确为您的WCF服务(可能还有您的ASP.NET客户端)。确保托管您的服务的IIS站点按照此TechNet article for IIS 7.中所述进行配置,开箱即用,IIS 7未启用Windows身份验证。如果您使用的是IIS 6,那么您需要搜索以查看它是如何配置用于Windows身份验证的。

为您的服务正确设置IIS后,需要配置调用服务的ASP.NET站点。默认情况下,Web站点的ASP.NET AppPool将使用本地计算机帐户(ApplicationPoolIdentity或可能的NetworkService)。您需要将该帐户更改为适当的域帐户。您还需要确保您的服务允许该域帐户通过在IIS管理器中添加授权规则或更新TechNet文章中所述的web.config文件服务来访问它。

+0

谢谢。我在IIS 5.1(运行XP)上本地托管ASP.NET客户端,并决定将其移动到运行IIS 6的服务器上并工作。应该知道。我认为这并不重要,但很高兴知道它为什么不起作用。5.任何想法? – Yaron 2012-01-06 09:56:35

+0

对不起,几年前从我的短期记忆中已经清除了IIS 5的知识:) – 2012-01-06 11:58:52