Как мне получить куки-файлы аутентификации во всех последующих заголовках HTTP-запросов к службе WCF?
У меня проблемы с получением файлов 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 в заголовке вынуждает" Redirect "вернуться к входу в систему, предотвращая доступ к службе. Я считаю, что первая просьба связана с использованием "сессий". Когда я отключаю "Сеансы" в моей службе 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 ответ
Я думаю, под сессией вы подразумеваете надежную сессию, разрешенную в вашей привязке Надежный сеанс отправляет инфраструктурные сообщения, которые находятся вне вашего контроля. Модификация этого поведения требует некоторой модификации на очень низком уровне стека каналов WCF.
Если вы хотите использовать сеанс ASP.NET, обрабатываемый файлами cookie, вы должны использовать режим совместимости ASP.NET. Даже при совместимости с ASP.NET WCF не предполагает, что аутентификация будет обрабатываться куки-файлами - правильный способ аутентификации каждого запроса. WCF также по умолчанию не использует куки вообще.
Режим совместимости ASP.NET предполагается использовать с простыми веб-сервисами - в качестве обратной совместимости со старыми веб-сервисами ASMX. Поэтому он не должен работать с более продвинутыми протоколами, такими как WS-Reliable Session. Используйте либо надежный сеанс, либо совместимость с ASP.NET - но не оба.
Как только вы используете надежный сеанс, у вас уже есть сеанс WCF (один экземпляр службы обрабатывает все запросы от одного экземпляра прокси-сервера клиента), поэтому вам не нужен сеанс ASP.NET. Если вы используете встроенный конвейер безопасности WCF, учетные данные должны автоматически отправляться прокси-сервером в каждом сообщении.