如何WCF服务重定向到HTTPS端点与Windows凭据
这里是我试图处理情况:如何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>
我想不通为什么这是一个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
这肯定解释了GET,但它看起来像WCF应该能够处理这个开关。也许在它的内部WCF只发送一个帖子的信用?就像这个框架的一部分没有正确实现?一定要知道的方法会很棒。 – 2012-03-14 18:34:37
401 Unauthorized包含相应的WWW-Authenticate头文件吗? – 2012-03-14 19:49:16
这两个401s(与重定向和没有重定向是相同的) – 2012-03-14 20:00:41
我只是做了类似的事情,我可以证实,这是行不通的。更糟的是,如果不更换默认的WCF HTTP传输实现,则可能无法进行更改。
重定向和身份验证均直接在内部的WCF HTTP处理内处理。您不能手动处理重定向导致问题,如果您得到301永久移动和WCF重定向后不使用您配置的客户端凭据。
具有重定向后发送GET代替POST的问题应该通过返回307临时重定向代替302实测值从理论上得到解决。
我敢肯定,我们尝试了这一点,WCF不理解响应。我希望有办法在4.5中处理这个,但我没有看着它呢。 – 2012-05-31 12:43:01
的可能的复制[为什么会失败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