Как получить куки-файлы аутентификации во всех последующих заголовках HTTP-запросов к службе WCF? - PullRequest
0 голосов
/ 10 июня 2011

У меня проблемы с получением cookie-файлов аутентификации, помещаемых в заголовки HTTP-запросов клиентской службы Windows, использующей службу WCF, размещенную в IIS, которая использует "сеансы". Клиентское приложение использует проверку подлинности с помощью форм для получения доступа к службе WCF. После успешной аутентификации я перехватываю заголовок HTTP-ответа, содержащий Set-Cookie для .ASPXAUTH и Set-Cookie для ASP.NET_SessionId. Я добавляю эти файлы cookie в заголовок HTTP-запроса для всех последующих запросов к службе WCF. Используя инструмент отладки Fiddler, я вижу, что для каждого запроса к службе WCF отправляются два HTTP-запроса. Первый заголовок HTTP-запроса не содержит куки, но второй HTTP-запрос содержит. Когда я защищаю службу, устанавливая в разделе «Авторизация» файла web.config значение «deny users =»? », Первый HTTP-запрос без файлов cookie в заголовке вызывает« перенаправление »для входа в систему, предотвращая доступ к службе. Первый запрос, который я считаю связанным с использованием «сессий». Когда я отключаю «Сеансы» в моей службе WCF, я получаю только один HTTP-запрос на вызов WCF, и файлы cookie находятся в заголовке. Как я могу получить файлы cookie, возвращенные после аутентификации, во всех заголовках HTTP-запросов, отправленных в мою службу WCF? Любая помощь в этом вопросе будет очень признателен.

Я включил свои привязки от клиента.

  <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>

1 Ответ

1 голос
/ 10 июня 2011

Полагаю, под сессией вы подразумеваете надежную сессию, разрешенную в вашей привязке.Надежный сеанс отправляет инфраструктурные сообщения, которые находятся вне вашего контроля.Модификация этого поведения требует некоторой модификации на очень низком уровне стека каналов WCF.

Если вы хотите использовать сеанс ASP.NET, обрабатываемый файлами cookie, вы должны использовать режим совместимости ASP.NET.Даже при совместимости с ASP.NET WCF не предполагает, что аутентификация будет обрабатываться куки-файлами - правильный способ аутентификации каждого запроса.WCF также по умолчанию вообще не использует файлы cookie.

Режим совместимости ASP.NET предполагается использовать с простыми веб-службами - в качестве обратной совместимости со старыми веб-службами ASMX.Поэтому он не должен работать с более продвинутыми протоколами, такими как WS-Reliable Session.Используйте либо надежный сеанс, либо совместимость с ASP.NET, но не оба.

Как только вы используете надежный сеанс, у вас уже есть сеанс WCF (один экземпляр службы обрабатывает все запросы от одного экземпляра прокси-сервера клиента), поэтому вам не нужен сеанс ASP.NET.Если вы используете встроенный конвейер безопасности WCF, учетные данные должны автоматически отправляться прокси-сервером в каждом сообщении.

...