我已经开发了一个WCF自托管服务,对此我有两个基本的安全需求,因为它会在互联网上访问:TransportWithMessageCredential没有足够的证书足够的WCF服务?
传输层应防止篡改和嗅探,尤其是认证的检索证书。这就是SSL所做的,但是从我所看到的设置SSL需要安装证书(除非可能通过使用普通证书文件的this hack),我不愿意这么做。
认证层应该由用户名/密码验证器组成。
我配置我的服务使用方法:
<security mode="TransportWithMessageCredential">
<message clientCredentialType="UserName" />
<transport clientCredentialType="Basic" />
</security>
即使传输层的HTTP(HTTPS不是),这确实让WCF创建另一个安全层,也就是相当于SSL?如果不是,安全强度有什么不同?
此外,是否有任何方法来保护元数据端点而不使用SSL证书(不是必需的,但将不胜感激)?
下面是自托管服务我完整的配置代码:
<?xml version="1.0"?>
<configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>
<system.serviceModel>
<services>
<service name="MyService">
<host>
<baseAddresses>
<add baseAddress = "http://localhost:8000/Services" />
</baseAddresses>
</host>
<endpoint address ="MyService" binding="wsHttpBinding" contract="IMyService">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="Binding1" maxReceivedMessageSize="2147483647">
<security mode="TransportWithMessageCredential">
<message clientCredentialType="UserName" />
<transport clientCredentialType="Basic" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="CR.Common.Services.CustomValidator, Common" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
谢谢!
我只是想尽可能没有证书的简单安装。服务器需要自定义用户名/密码(无Windows认证),然后保证通信机密性和完整性。 –
正如我告诉过你的,你需要“东西”来签署和加密消息,这就是为什么你的UserNamePasswordValidator需要一个证书。你可以找到一些破解,使其没有证书,但是那么你的消息将不会被签名/加密。安装证书非常简单,您也可以使用自动签署的证书(在服务器本身生成),因此不会花费您一些钱。 – Fabske
我最终只使用服务器证书,但我仍然认为它可以使我的scenarii变得更简单。 –