Сессии WCF с HTTPS

Я не могу выяснить, как включить экземпляры на сессию для моего сервиса WCF при использовании HTTPS. (Я не эксперт ASP.NET, но не хочу использовать состояние сеанса ASP.NET, если это возможно.) Я использую Платформу.NET 3.0.

Я достиг следующего противоречия, и надеюсь, что кто-то может сказать мне, где существует дефект в логике.

1) Сервис должен быть размещен на IIS 6 из-за клиентского мандата.

2) Сервис должен поддержать состояние между вызовами, включая экземпляры SqlConnection и SqlTransaction (ужасный, но необходимый из-за ограничений проекта).

3) Поэтому я должен использовать wsHttpBinding.

4) Сервис должен смочь к информации об аутентификации пользователя доступа от HttpContext. Текущий. Пользователь. Идентификационные данные (например, безопасность Windows использования в IIS).

5) HTTPS поэтому требуется.

6) Безопасность транспортного уровня должна поэтому быть настроена на привязке.

7) Конфигурирование сервиса для требования сессий означает, что я должен настроить wsHttpBinding для использования Надежных Сессий.

8) Это требует, чтобы безопасность уровня сообщения была настроена на привязке.

Т.е. (6) и (8) являются взаимоисключающими.

Кажется, что использование, сессии WCF требуют, чтобы я использовал безопасность уровня сообщения, которая препятствует тому, чтобы я использовал HTTPS.

Что я пропускаю?

8
задан Enrico Campidoglio 13 August 2019 в 12:11
поделиться

2 ответа

3) Правда, wsHttpBinding и wsDualHttpBinding являются единственными HTTP-связываниями та поддержка сессии

5) Ложь, для аутентификации сервисных вызывающих сторон, у Вас должна не обязательно быть любая безопасность транспортного уровня (такая как SSL/HTTPS). Единственное требование состоит в том, чтобы настроить IIS для включения Интегрированной аутентификации Windows для виртуального каталога. Затем в WCF у Вас есть три возможности включить этот сценарий:

a) Используйте безопасность транспортного уровня на wsHttpBinding с учетными данными Windows (HTTPS)

<system.serviceModel>
    <bindings>
        <wsHttpBinding>
            <binding name="SecurityEnabledWsHttp">
                <security mode="Transport">
                    <transport clientCredentialType="Windows" />
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
</system.serviceModel>

b) Используйте безопасность уровня сообщения на wsHttpBinding с учетными данными Windows (HTTP)

<system.serviceModel>
    <bindings>
        <wsHttpBinding>
            <binding name="SecurityEnabledWsHttp">
                <security mode="Message">
                    <message clientCredentialType="Windows" />
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
</system.serviceModel>

c) Выполните свой сервис под Режимом эмуляции ASP.NET и включите аутентификацию Windows в ASP.NET (HTTP)

<system.web>
    <authentication mode="Windows" />
</system.web>

Обратите внимание в a и b доступ к идентификационным данным вызывающей стороны из сервиса этот путь:

OperationContext.Current.ServiceSecurityContext.WindowsIdentity

6) Правда, безопасность транспортного уровня должна быть включена на wsHttpBinding для использования HTTPS

7) Ложь, Надежные Сессии являются конкретной реализацией Надежного Обмена сообщениями для сессий WCF. Надежным Обменом сообщениями является WS -* стандартная спецификация, разработанная для гарантии доставки сообщений на ненадежную сеть. Можно использовать сессии WCF без Надежного Обмена сообщениями, и наоборот. Сессии включены по контракту на обслуживание с этим атрибутом:

[ServiceContract(SessionMode=SessionMode.Required)]
public interface IMyService {
    // ...
}

Также помните что для поддержания состояния между служебными вызовами, которые необходимо будет явно включить соответствующему режиму экземпляра на реализации контракта на обслуживание:

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
public class MyService : IMyService {
    // ...
}

Существует два вида сессий в WCF: Безопасные Сессии и Надежные Сессии. Настройка по умолчанию и для wsHttpBinding и для netTcpBinding должна использовать Безопасные Сессии.
Для wsHttpBinding это выполняется с безопасностью уровня сообщения при помощи учетных данных клиента, которые являются настройкой по умолчанию для привязки.
Для netTcpBinding вместо этого, сессия устанавливается на транспортном уровне при помощи средств протокола TCP.
Это означает, что просто переключение на wsHttpBinding или netTcpBinding включит поддержку сессий WCF.
Альтернатива должна использовать Надежные Сессии. Это должно явно быть включено в обязательной конфигурации и удаляет требование использования безопасности сообщения для wsHttpBinding. Таким образом, это будет работать:

<bindings> 
    <wshttpbinding> 
        <binding name="ReliableSessionEnabled"> 
            <reliablesession enabled="True" ordered="False" /> 
            <security mode="None" /> 
        </binding> 
    </wshttpbinding> 
</bindings>

8) Ложь, Надежные Сессии используются независимо от настроек безопасности канала передачи.

Для более подробного объяснения взгляните на эту статью.

16
ответ дан 5 December 2019 в 09:26
поделиться

Выполняя на превосходном ответе Enrico, это конфигурации, которые я использую:

Сервис:

<services>
    <service name="Foo.Bar.Service">
        <endpoint name="EndpointHttps"
            address=""
            binding="customBinding" bindingConfiguration="EndpointHttps"
            contract="Foo.Bar.IService" />
    </service>
</services>
<bindings>
    <customBinding>
        <binding name="EndpointHttps">
            <reliableSession />
            <mtomMessageEncoding />
            <httpsTransport />
        </binding>
    </customBinding>
</bindings>

Клиент:

<client>
    <endpoint name="EndpointHttps"
        address="https://server/FooBar/service.svc"
        binding="customBinding" bindingConfiguration="EndpointHttps"
        contract="Foo.Bar.IService" />
</client>
<bindings>
    <customBinding>
        <binding name="EndpointHttps">
            <reliableSession />
            <mtomMessageEncoding />
            <httpsTransport />
        </binding>
    </customBinding>
</bindings>

Примечание: все еще не заставили это работать с аутентификацией Windows все же.

2
ответ дан 5 December 2019 в 09:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: