2

我一直在谷歌搜索我可能找到的所有地方(包括 Stackoverflow 上的此处)以找出一个错误,我试图在 Windows 7 x64 上将 WCF 服务部署到 IIS 7.5,该服务仅通过 SSL 和基本 HTTP 身份验证运行。我在 IIS 中有一个站点,它绑定到带有自签名证书的 HTTPS 端口 50443。(我不能使用标准端口 443,因为我们计划将它部署到已经运行 Tomcat 的服务器上的 IIS,该服务器正在监听 80 和 443。)

这是 web.config:

<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <basicHttpBinding>
        <binding name="SSLBinding">
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Basic"/>
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <services>
      <service name="HelloWorldWcf.HelloWorldWcfService">
        <endpoint name="HelloWorldWcf.HelloWorldWcfService" 
                  address="https://mylaptop:50443/HelloWorld/Service1.svc" 
                  binding="basicHttpBinding" 
                  bindingConfiguration="SSLBinding" 
                  contract="HelloWorldWcf.IHelloWorldWcfService"/>
        <endpoint address="https://mylaptop:50443/HelloWorld/Service1.svc/mex" 
                  binding="mexHttpsBinding" 
                  contract="IMetadataExchange"/>
      </service>
    </services>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>

如果我浏览到服务端点地址并手动输入基本身份验证凭据,我会在浏览器中收到以下异常错误消息:

提供的 URI 方案“https”无效;预期的“http”。
参数名称:context.ListenUriBaseAddress

这与我尝试针对类似服务运行 WCF 客户端时遇到的错误相同,只是它以“参数名称:via”结尾(因为调用堆栈中显示的方法的参数名称为“System.ServiceModel. Channels.TransportChannelFactory`1.ValidateScheme(URI via)”,其实就是“via”)。

我已经调整了服务器和客户端配置文件很多次了,但我已经迷失了方向,但是上面的 web.config 文件是我迄今为止最好的猜测——它甚至不能在浏览器上运行,更不用说 WCF 客户端了.

我需要做什么才能访问托管在非标准 SSL 端口上的 IIS 7.5 中的 WCF 服务,并通过 HTTPS 进行基本 HTTP 身份验证?帮助!(& 谢谢!)

4

2 回答 2

5

尝试将此添加到绑定

<security mode="Transport"> 
    <transport clientCredentialType="None" proxyCredentialType="None" realm=""/> 
    <message clientCredentialType="Certificate" algorithmSuite="Default" />
</security> 
于 2012-07-16T21:45:56.610 回答
4

啊!好的,让它工作的剩余步骤:

  1. 将 web.config 中的 <security> 节点替换为burning_LEGION。

  2. 从 web.config 中删除“mex”端点。(这使我可以在浏览器中访问通常的“您已创建服务”友好网页。)

  3. 转义了我在客户端 C# 代码中分配给 HelloWorldWcfServiceClient.ClientCredentials.UserName.UserName 的“DOMAIN\username”字符串中的反斜杠。(我是不是说“arrrrgh!”?伙计,我的脸红了。)这消除了我在第 1 步和第 2 步后得到的错误:

System.ServiceModel.Security.MessageSecurityException:“HTTP 请求未使用客户端身份验证方案“基本”进行授权。从服务器收到的身份验证标头是“基本领域 =“mylaptop”'.---> System.Net.WebException:远程服务器返回错误:(401)未经授权。

我从这里得到了第 2 步的想法,这让我认为 mex 对 HTTPS 不满意,而对于第 3 步我注意到用户名是 @"domain\username",而不是"domain\username"。

+1 燃烧_LEGION 的协助!

所以,未回答的问题:(1)为什么安全/消息节点对不使用消息安全(仅传输安全)的配置有任何影响?(2) 如果 mex 端点只是干扰正常操作,它的意义何在?(3) 如果 mode="TransportCredentialOnly" 不适用于 HTTPS,为什么我没有收到错误提示?

于 2012-07-17T18:46:12.713 回答