2

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

“HTTP 请求未经客户端身份验证方案‘协商’未经授权。从服务器收到的身份验证标头为‘协商,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();
4

1 回答 1

1

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

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

于 2012-01-05T20:57:16.633 回答