我有一個WCF服務將由託管在Web服務器上的應用程序調用(對於中短期來說,我們只需要一個Web服務器,因此無視可伸縮性問題)保護在公共MVC2中託管的WCF應用程序
網絡服務器提供公共網站。在example.com
WCF服務暴露了調用,其中包括運行作業,並提供Web模型不支持的某些管理功能,例如長時間運行的數據庫操作。
WCF服務必須託管在網站內部,因爲它使用兼容模式來利用Asp.Net http管道 - 具體來說,該服務可以生成電子郵件,並使用MVC對電子郵件進行模板化。其中一個副作用是呼叫必須使用公開可見的主機名,例如https://example.com/JobService.svc
,以便電子郵件中的鏈接指向example.com
而不是localhost
或類似鏈接。
顯然,我不希望普通大衆能夠啓動作業/管理任務,所以我想保護WCF服務。
由於依賴於Asp.net http管道,我只能使用https而不是net.tcp或類似的綁定。
我必須綁定到可公開訪問的IP地址,以便能夠使用正確的主機名(除非有人知道解決的辦法?)
我無法使用Kerberos/NTLM作爲服務器不在域(和NTLM弱反正)
,因爲它抱怨我不能使用證書:
The SSL settings for the service 'SslRequireCert' does not match those of the IIS 'None'.
注:我不太明白這是網站本身只通過HTTPS服務。 http只是通過https返回一個重定向到同一頁面。我有一個有趣的問題是,儘管mex是通過https服務的,但WSDL中的URL使用http。我假設這是一個副作用,不能正確設置TLS我的服務,所以它認爲它是http即使它也響應https)
因此,我正在用盡如何確保我的服務的想法。當然,我可以從服務內部檢查請求並確定它是否來自當前服務器使用的IP - 但這種感覺非常令人討厭,我實際上忽視了專家的工作,並試圖將其中的某些內容地方 - 不是一個很好的開始。
任何人都可以提出一種方法來限制對本地計算機上的進程訪問此服務嗎?
我附上了我目前的配置。 (這是目前給我上面提到的證書錯誤)
<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>
感謝您的回答,但除非我誤解,否則不能解決我的問題。我無法使用其他網站 - 我需要能夠通過我的WCF服務發送與網站上的用戶操作相同的電子郵件。我不想每次定義電子郵件兩次,因爲這不會幹。根據我的問題(127.0.0.1 = localhost)中解釋的原因,綁定到127.0.0.1將不起作用。 – Basic 2011-01-27 11:08:09