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





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. Я не обнаружил, что это правда: без включения надежных сеансов я получил «привязку, не настроенную для поддержки сеансов» или что-то в этом роде. Возможно, теперь все будет по-другому.
Я обновил сообщение, добавив дополнительную информацию о сессиях WCF. Возможно, вы использовали другую привязку или явно отключили безопасность?
Вот полезная статья: lybecker.com/blog/2007/04/30/…
Следуя отличному ответу Энрико, я использую следующие конфигурации:
Услуга:
<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.
Вы сталкиваетесь с конкретными ошибками в этой конфигурации или проверяете, возможна ли эта конфигурация?