Защита WCF, размещенной в общедоступном приложении MVC2 - PullRequest
0 голосов
/ 26 января 2011

У меня есть служба 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>

Ответы [ 2 ]

0 голосов
/ 14 апреля 2011

В конце концов, я был вынужден внедрить собственную систему аутентификации. Это было относительно просто, так как authenticatio подразумевало авторизацию - т.е. никаких уровней разрешений. Тем не менее, я все еще недоволен решением и изменит его, если появится другой вариант.

0 голосов
/ 27 января 2011

«Кто-нибудь может предложить способ ограничить доступ к этой службе процессами на локальной машине?»

Запустите службу на другом веб-сайте в IIS, если вы этого еще не сделали.

Вы можете привязать свою службу в IIS к IP-адресу внутренней сети, что позволит внутренним клиентам локальной сети получать доступ к службе, но не внешним клиентам.

Другой вариант привязки - привязка к порту, который не открыт в брандмауэре, чтобы разрешить доступ только внутренним клиентам. Более того, привязка к порту, который не открыт на брандмауэре, и привязка к IP внутренней сети.

Вы также можете попробовать привязку к IP-адресу 127.0.0.1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...