0

我无法将身份验证 cookie 放入客户端 Windows 服务的 HTTP 请求标头中,该服务使用托管在 IIS 中的 WCF 服务,该服务使用“会话”。客户端应用程序使用表单身份验证来访问 WCF 服务。成功验证后,我捕获 HTTP 响应标头,其中包含 .ASPXAUTH 的 Set-Cookie 和 ASP.NET_SessionId 的 Set-Cookie。我将这些 cookie 添加到对 WCF 服务的所有后续请求的 HTTP 请求标头中。使用 Fiddler 调试工具,我可以看到对于 WCF 服务的每个请求,都会发送两个 HTTP 请求。第一个 HTTP 请求标头不包含 cookie,但第二个 HTTP 请求包含。当我通过将 web.config 的授权部分设置为“拒绝用户=”?”来保护服务时,标头中没有 cookie 的第一个 HTTP 请求会强制“重定向”返回登录,从而阻止访问服务。我认为第一个请求与“会话”的使用有关。当我在 WCF 服务中禁用“会话”时,每次 WCF 调用我只会收到一个 HTTP 请求,并且 cookie 位于标头中。如何在发送到我的 WCF 服务的所有 HTTP 请求标头中获取从身份验证返回的 cookie?对此问题的任何帮助将不胜感激。如何在发送到我的 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>
4

1 回答 1

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 安全管道身份验证凭据,则代理应在每条消息中自动发送。

于 2011-06-10T07:36:47.440 回答