Сеансы WCF с HTTPS

Я не могу понять, как включить экземпляры для каждого сеанса для моей службы 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.

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

Вы сталкиваетесь с конкретными ошибками в этой конфигурации или проверяете, возможна ли эта конфигурация?

Agent_9191 11.01.2009 06:14

Я хотел бы знать, возможен ли конфиг: т.е. сеансы WCF с HTTPS. Спасибо.

Ian Horwill 13.01.2009 15:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
2
7 244
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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>

б) Используйте безопасность на уровне сообщений в 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>

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

OperationContext.Current.ServiceSecurityContext.WindowsIdentity

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

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

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

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

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

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

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

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

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

Спасибо за подробный ответ. Один вопрос: в разделе (7) вы говорите, что сеансы включаются путем установки свойства SessionMode. Я не обнаружил, что это правда: без включения надежных сеансов я получил «привязку, не настроенную для поддержки сеансов» или что-то в этом роде. Возможно, теперь все будет по-другому.

Ian Horwill 14.01.2009 15:22

Я обновил сообщение, добавив дополнительную информацию о сессиях WCF. Возможно, вы использовали другую привязку или явно отключили безопасность?

Enrico Campidoglio 14.01.2009 16:10

Вот полезная статья: lybecker.com/blog/2007/04/30/…

Enrico Campidoglio 14.01.2009 16:13

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

Услуга:

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

Другие вопросы по теме