У меня есть служба WCF, которая должна вызываться приложением, размещенным на веб-сервере (в краткосрочной перспективе нам потребуется только один веб-сервер, поэтому не обращайте внимания на проблемы масштабируемости)
Веб-сервер обслуживает общедоступный веб-сайт.в example.com
Служба WCF предоставляет вызовы, которые, помимо прочего, выполняют задания и предоставляют определенные функции администратора, не поддерживаемые веб-моделью, например, длительные операции с базой данных.
Служба WCF должна бытьразмещенный на веб-сайте, поскольку он использует режим совместимости для использования преимуществ конвейера http (s) Asp.Net - в частности, служба может генерировать электронные письма, а электронные письма создаются с использованием MVC.Одним из побочных эффектов этого является то, что вызов должен использовать публично видимое имя хоста, например, https://example.com/JobService.svc
, чтобы ссылки в электронных письмах указывали на example.com
, а не на localhost
или подобное.
Очевидно, я неЯ не хочу, чтобы широкая публика могла запускать задания / задачи администратора, поэтому я хочу защитить службу WCF.
Я могу использовать только HTTPS, а не Net.tcp или аналогичный для привязки благодаря полагаясьна конвейере http Asp.net.
Я должен привязаться к общедоступному IP-адресу, чтобы иметь возможность использовать правильное имя хоста (если кто-то не знает способ обойти это?)
Я могуне использую kerberos / NTLM, так как сервер не находится в домене (и NTLM все равно слаб)
Я не могу использовать сертификаты, так как он жалуется:
The SSL settings for the service 'SslRequireCert' does not match those of the IIS 'None'.
NB: IЯ не совсем понимаю, так как сам сайт обслуживается только через https.http просто возвращает перенаправление на ту же страницу через https.
(Интересная проблема, с которой я столкнулся, заключается в том, что хотя мекс обслуживается через https, URL-адреса внутри WSDL используют http. Я предполагаю, что этопобочный эффект неумения правильно настроить TLS на моем сервисе, поэтому он считает, что это http, хотя он также отвечает по https)
Итак, у меня заканчиваются идеи о том, как защитить свой сервис,Я мог бы, конечно, изнутри самой службы изучить запрос и определить, исходит ли он от IP-адреса, используемого текущим сервером, - но это кажется очень неприятным, и я фактически игнорирую работу экспертов и пытаюсь что-то поместить в егоplace - Не очень хорошее место для начала.
Может кто-нибудь предложить способ ограничить доступ к этому сервису процессами на локальной машине?
Я приложил свою текущую конфигурацию ниже.(Это дает мне ошибку сертификата, упомянутую выше)
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="WebJobServiceHTTPBinding" openTimeout="00:10:00"
sendTimeout="00:10:00">
<security mode="Transport">
<transport clientCredentialType="Certificate" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true"
aspNetCompatibilityEnabled="true">
<serviceActivations>
<add relativeAddress="WebJob.svc"
service="MyApp.WebJobService"
factory="MyApp.WCFDIServiceHostFactory" />
</serviceActivations>
</serviceHostingEnvironment>
<services>
<service behaviorConfiguration="WebJobServiceBehavior" name="MyApp.WebJobService">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="WebJobServiceHTTPBinding"
name="HTTPEndpoint" contract="MyApp.JobService.Common.IWebJobService" />
</service>
</services>
<standardEndpoints>
<mexEndpoint>
<standardEndpoint name="WebJobServiceMex" />
</mexEndpoint>
</standardEndpoints>
<behaviors>
<serviceBehaviors>
<behavior name="WebJobServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceCredentials>
<serviceCertificate findValue="[Thumbprint of x509 cert used by website for SSL]"
storeName="Root" x509FindType="FindByThumbprint" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>