WCF сессии с HTTPS - PullRequest
       14

WCF сессии с HTTPS

8 голосов
/ 09 января 2009

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

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

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

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

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

4) Служба должна иметь возможность доступа к информации аутентификации пользователя из HttpContext.Current.User.Identity (например, с использованием безопасности Windows в IIS).

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

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

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

8) Для этого необходимо, чтобы на привязке была настроена защита на уровне сообщений.

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

Похоже, что для использования сеансов WCF необходимо использовать защиту на уровне сообщений, что не позволяет мне использовать HTTPS.

Чего мне не хватает?

Ответы [ 2 ]

15 голосов
/ 14 января 2009

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

5) False , для проверки подлинности вызывающих абонентов не обязательно иметь какую-либо защиту на транспортном уровне (например, 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>

в) Запустите службу в режиме совместимости ASP.NET и включите Аутентификация Windows в ASP.NET (HTTP)

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

Обратите внимание, что в a и b вы получите доступ к идентификатору вызывающего абонента из службы следующим образом:

OperationContext.Current.ServiceSecurityContext.WindowsIdentity

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

7) False , Reliable Sessions - это конкретная реализация Reliable Messaging для сеансов 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.
Альтернативой является использование Reliable Sessions . Это должно быть явно включено в конфигурации привязки и устраняет требование использования безопасности сообщений для wsHttpBinding. Так что это будет работать:

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

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

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

2 голосов
/ 25 февраля 2009

Следуя превосходному ответу Энрико, я использую следующие конфигурации:

Услуги:

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

...