【问题标题】:Passing windows identity to WCF from ASP.NET从 ASP.NET 将 Windows 标识传递给 WCF
【发布时间】:2012-02-03 05:59:21
【问题描述】:

我有一个托管在 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();

【问题讨论】:

    标签: asp.net wcf wcf-security basichttpbinding wcf-authentication


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。我在 IIS 5.1(运行 XP)上本地托管 ASP.NET 客户端,我决定将其移动到运行 IIS 6 的服务器上并且它工作正常。应该知道的。我想这并不重要,但很高兴知道为什么它在 5 上不起作用。有什么想法吗?
    • 抱歉,IIS 5 知识已在几年前从我的短期记忆中消失 :)
    猜你喜欢
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多