保护在公共MVC2 App中托管的WCF

时间:2011-01-26 14:23:43

标签: wcf security asp.net-mvc-2 .net-4.0

我有一个WCF服务,由Web服务器上托管的应用程序调用(对于中短期,我们只需要一个Web服务器,因此无视可伸缩性问题)

网络服务器服务于公共网站。在example.com

WCF服务公开调用,其中包括运行作业和提供Web模型不支持的某些管理功能,例如长时间运行的数据库操作。

WCF服务必须托管在网站内部,因为它使用兼容模式来利用Asp.Net http(s)管道 - 具体来说,该服务可以生成电子邮件,并且使用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>

2 个答案:

答案 0 :(得分:0)

“任何人都可以建议一种方法来限制对本地计算机上的进程访问此服务吗?”

如果您尚未在IIS中的其他网站上运行您的服务。

您可以将IIS中的服务绑定到内部网络IP地址,这将允许内部LAN客户端访问服务,但不能访问外部客户端。

另一个绑定选项是绑定到防火墙上未打开的端口,以便仅允许从内部客户端进行访问。更好的是,绑定到防火墙未打开的端口,绑定到内部LAN IP。

您也可以尝试绑定到IP地址127.0.0.1。

答案 1 :(得分:0)

最后,我被迫实施自己的身份验证系统。这是相对简单的,因为认证暗示授权 - 即没有许可级别。也就是说,我仍然对解决方案感到不满,并且如果有其他选择,我会改变它。