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

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

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

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

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

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

+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос