2012-03-14 75 views
6

这里是我试图处理情况:如何WCF服务重定向到HTTPS端点与Windows凭据

我们有一个WCF客户端与HTTP端点工作和HTTPS端点而不是在它从http重定向(302)到https。我们有一个正在执行重定向和SSL功能的F5负载均衡器,但据我所知,它并没有对请求产生任何意想不到的结果。重定向似乎是WCF在重定向执行后不想提供Windows Kerberos身份验证信息的罪魁祸首。

一个成功的调用(即HTTP无重定向)的顺序是这样的:

  • 客户端 - 发送POST请求的服务以http方式
  • 服务器 - 与401未经授权
  • 客户端响应 - 发送具有授权的协商POST
  • 服务器 - 以100继续响应
  • 客户端 - 发送肥皂数据并成功完成

当呼叫重定向和失败,它是这样的:

  • 客户端 - 发送POST请求的服务以http方式
  • 服务器 - 具有重定向返回302到https方案为同一地址
  • 客户端 - 发送GET为HTTPS地址(我想不通为什么这是一个GET而不是POST)
  • 服务器 - 与401未经授权
  • 回应0
  • 客户端 - 抛出异常“HTTP请求未经客户端身份验证方案”协商“授权。从服务器接收认证报头是“协商,NTLM”。”

它类似于this problem但不完全相同(并没有一个真正的答案了,虽然它引用‘破WCF协议’如果我们关闭F5重定向规则http和https通信工作正常WCF是否真的不处理这个简单的重定向?是否有解决方法或任何文档在这个缺陷?

客户端配置请注意,当使用https测试时,我将TransportCredentialOnly更改为传输):

<client> 
     <endpoint address="http://fooserver/MyService.svc/" binding="basicHttpBinding" bindingConfiguration="clientBinding" contract="Contracts.IMyService" /> 
</client> 
<bindings> 
<basicHttpBinding> 
    <binding name="clientBinding"> 
     <security mode="TransportCredentialOnly"> 
      <transport clientCredentialType="Windows" proxyCredentialType="Windows" /> 
     </security> 
    </binding> 
</basicHttpBinding> 

服务器的配置是这样的:

<system.serviceModel> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    <services> 
     <service behaviorConfiguration="MyServiceBehavior" name="MyService"> 
      <endpoint address="" binding="basicHttpBinding" bindingConfiguration="securedBinding" contract="Contracts.IMyService"> 
      </endpoint> 
     </service> 
    </services> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="securedBinding"> 
       <security mode="TransportCredentialOnly"> 
        <transport clientCredentialType="Windows" proxyCredentialType="Windows"/> 
       </security> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="MyServiceBehavior"> 
       <serviceMetadata httpGetEnabled="true"/> 
       <serviceDebug includeExceptionDetailInFaults="true"/> 
       <useRequestHeadersForMetadataAddress> 
        <defaultPorts> 
         <add scheme="http" port="80" /> 
         <add scheme="https" port="443" /> 
        </defaultPorts> 
       </useRequestHeadersForMetadataAddress> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 
+0

的可能的复制[为什么会失败WCF调用遇到302响应时,SOAP服务?(http://stackoverflow.com/questions/17152385/why-would-wcf-fail-to-call-a -so--302-response-is-encounter) – Luizgrs 2015-10-08 20:12:04

回答

1

我想不通为什么这是一个GET而不是POST

那是你的问题的原因。在接收到对POST的302响应之后,预计客户端会获取新URL的行为。看到在http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

如果接收响应302个的状态码比GET或HEAD,用户代理不能自动重定向请求,除非它可以由用户来确认其他的请求下,因为这可能改变发出请求的条件。

此外,下面的SO职位有一些好的信息:Response.Redirect with POST instead of Get?

所以WCF是做什么的,应该拒绝302重定向后重新发布做。不幸的是我不知道可以做些什么来解决你的问题,其他的不是指定正确的协议,在第一时间,以避免302

+0

这肯定解释了GET,但它看起来像WCF应该能够处理这个开关。也许在它的内部WCF只发送一个帖子的信用?就像这个框架的一部分没有正确实现?一定要知道的方法会很棒。 – 2012-03-14 18:34:37

+0

401 Unauthorized包含相应的WWW-Authenticate头文件吗? – 2012-03-14 19:49:16

+0

这两个401s(与重定向和没有重定向是相同的) – 2012-03-14 20:00:41

1

我只是做了类似的事情,我可以证实,这是行不通的。更糟的是,如果不更换默认的WCF HTTP传输实现,则可能无法进行更改。

重定向和身份验证均直接在内部的WCF HTTP处理内处理。您不能手动处理重定向导致问题,如果您得到301永久移动和WCF重定向后不使用您配置的客户端凭据。

具有重定向后发送GET代替POST的问题应该通过返回307临时重定向代替302实测值从理论上得到解决。

+0

我敢肯定,我们尝试了这一点,WCF不理解响应。我希望有办法在4.5中处理这个,但我没有看着它呢。 – 2012-05-31 12:43:01

相关问题