Короткий ответ: да, необходим mutex
.
Как вы уже упоминали, когда ваш сайт работает в пуле приложений с несколькими рабочими процессами, ваш веб-сайт может выполняться различными процессами.
Необходимая блокировка зависит от типа используемого вами ресурса. Блокировка объекта будет достаточной, если ресурс должен быть потокобезопасным только в этом процессе. Примером этого является HttpApplicationState
.
Однако общий ресурс, такой как файл, является внешним по отношению к процессу и не управляется процессом. Блокировка между процессами может быть предоставлена только mutex
.
Следующие шаги являются руководством для запущения Вас:
1) Во-первых, Вам нужны Корневые полномочия для генерации сертификатов клиента и сервера. Можно или использовать внешнего Поставщика полномочий (например, Verisign), или можно генерировать собственное использование чего-то как Microsoft Certificate Server.
Для генерации Корневого сертификата полномочий разработки можно использовать "makecert" инструмент, который идет с Visual Studio, например,
makecert -n "CN=MyRootCA" -r -sv RootCA.pvk RootCA.cer
2) затем необходимо запросить/генерировать сертификаты клиента и сервера. Оба типа сертификатов могут быть установлены как локальные сертификаты машины и обе потребности, которые будут подписаны с помощью тех же корневых полномочий. Можно запросить клиентские сертификаты от веб-интерфейса Microsoft Certificate Server, например, http://mycertserver/certsrv
.
Для генерации клиентского сертификата разработки для каждой машины можно использовать "makecert" снова. Обратите внимание, что клиентские сертификаты подписываются с Корневым сертификатом полномочий разработки, созданным на шаге 1.
makecert -pe -n "CN=MyCert" -ss my -sky exchange -sk MyCert
-iv MyRootCA.pvk -ic MyRootCA.cer -sr localmachine MyCert.cer
, Это установит сертификат на машине, на которой команда выполняется в Персональную папку сертификатов в Локальном хранилище Машины.
Для сервера для доверия клиентским сертификатам необходимо будет установить Корневой сертификат полномочий разработки в Доверяемом хранилище Корневых центров сертификации сервера (используйте mmc снимок Сертификатов - в сделать это). Клиентам нужно также установить корневой сертификат таким же образом так, чтобы они доверяли своим собственным сертификатам.
3) Настраивают Вас сервис WCF для требования аутентификации клиента с помощью сертификата (например, через web.config).
<services>
<service
name="TestService"
behaviorConfiguration="wsHttpCertificateBehavior">
<endpoint name="TestEndPoint"
address=""
binding="wsHttpBinding"
bindingConfiguration="wsHttpEndpointBinding"
contract="TestService.IMyContract">
<identity>
<dns value=""/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="wsHttpEndpointBinding">
<security mode="Message">
<message clientCredentialType="Certificate"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<behavior name="wsHttpCertificateBehavior">
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="true"/>
<serviceCredentials>
<clientCertificate>
<authentication
certificateValidationMode="PeerOrChainTrust"
revocationMode="NoCheck"/>
</clientCertificate>
<serverCertificate findValue="CN=MyCert"/>
</serviceCredentials>
</behavior>
</behaviors>
4) Теперь настраивают вызывающую сторону (например, через app.config).
<client>
<endpoint name="wsHttpBinding"
address="https://localhost/TestService/TestService.svc"
binding="wsHttpBinding"
bindingConfiguration="wsHttpBinding"
behaviorConfiguration="wsHttpCertificateBehavior"
contract="TestService.IMyContract">
<identity>
<dns value="MyCert"/>
</identity>
</endpoint>
</client>
<bindings>
<wsHttpBinding>
<binding name="wsHttpBinding">
<security mode="Message">
<message clientCredentialType="Certificate"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="wsHttpCertificateBehavior">
<clientCredentials>
<clientCertificate findValue="MyCert" storeLocation="LocalMachine"/>
<serviceCertificate>
<authentication
certificateValidationMode="PeerOrChainTrust"
revocationMode="NoCheck"
trustedStoreLocation="LocalMachine"/>
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
Я рекомендовал бы читать Руководство по безопасности WCF из Microsoft
, Это имеет дело с этим сценарием, а также многими другими
http://www.codeplex.com/WCFSecurityGuide/
редактирование: теперь в https://archive.codeplex.com/? p=wcfsecurityguide