我很难将身份验证Cookie放入客户端Windows服务的HTTP请求标头中,而该服务使用的是使用“会话”的IIS中托管的WCF服务。客户端应用程序使用表单身份验证来访问WCF服务。身份验证成功后,我捕获HTTP响应头包含.ASPXAUTH的Set-Cookie和ASP.NET_SessionId的Set-Cookie。我将这些cookie添加到HTTP请求标头中,以用于对WCF服务的所有后续请求。使用Fiddler调试工具,我可以看到,对于WCF服务的每个请求,都会发送两个HTTP请求。第一个HTTP请求标头不包含cookie,但第二个HTTP请求包含cookie。当我通过将web.config的Authorization部分设置为'deny users =“?”'来保护服务时,标头中没有cookie的第一个HTTP Request会强制“重定向”返回登录状态,从而阻止访问该服务。我认为第一个请求与“会话”的使用有关。当我在WCF服务中禁用“会话”时,每个WCF调用只获得一个HTTP请求,并且cookie位于标头中。如何在发送到我的WCF服务的所有HTTP请求标头中获取从身份验证返回的cookie? 任何有关此问题的帮助将非常感谢。
我已将我的绑定包含在客户端中。
<customBinding>
<binding name="CustomBinding_IMySyncService" receiveTimeout="00:01:00"
sendTimeout="00:01:00">
<reliableSession acknowledgementInterval="00:00:30"
inactivityTimeout="00:03:00"
maxTransferWindowSize="4096" />
<binaryMessageEncoding maxReadPoolSize="2147483647" maxWritePoolSize="2147483647">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
</binaryMessageEncoding>
<httpsTransport manualAddressing="false" maxBufferPoolSize="2147483647"
maxReceivedMessageSize="2147483647" allowCookies="false" authenticationScheme="Anonymous"
bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard"
keepAliveEnabled="true" maxBufferSize="2147483647" proxyAuthenticationScheme="Anonymous"
realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
useDefaultWebProxy="true" />
</binding>
<binding name="CustomBinding_AuthenticationService">
<binaryMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
</binaryMessageEncoding>
<httpsTransport manualAddressing="false" maxBufferPoolSize="524288"
maxReceivedMessageSize="65536" allowCookies="false" authenticationScheme="Anonymous"
bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard"
keepAliveEnabled="true" maxBufferSize="65536" proxyAuthenticationScheme="Anonymous"
realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
useDefaultWebProxy="true" />
</binding>
</customBinding>
答案 0 :(得分:1)
我想通过会话你的意思是你的绑定允许可靠的会话。可靠的会话发送不受您控制的基础架构消息。在极低级别的WCF通道堆栈上修改该行为需要进行一些修改。
如果要使用Cookie处理的ASP.NET会话,则必须使用ASP.NET兼容模式。即使使用ASP.NET兼容性,WCF也不会假设身份验证将由cookie处理 - 正确的方法是验证每个请求。默认情况下,WCF根本不使用cookie。
ASP.NET兼容模式应该与普通Web服务一起使用 - 作为与旧ASMX Web服务的向后兼容性。因此,它不必使用更高级的协议,如WS-Reliable Session。使用可靠的会话或ASP.NET兼容性 - 不是两者兼而有之。
使用可靠会话后,您已经拥有WCF会话(单个服务实例处理来自同一客户端代理实例的所有请求),因此您不需要ASP.NET会话。如果您使用内置WCF安全管道身份验证凭据,则应由代理在每封邮件中自动发送。