我相信您想使用 HTTPS 来确保传输级别的加密和签名。您需要先使用 SSL 证书配置 IIS7.5,并在托管服务的应用程序中允许 https。检查this tutorial,但您将使用现有证书而不是创建自签名证书。您的证书应该为您网站的主机标头(例如 mydomain.com)或您的服务器名称(如果直接公开)创建。
在您的服务中,您需要具有传输安全性的 basicHttpBinding 和用于身份验证的消息凭据。
<bindings>
<basicHttpBinding>
<binding name="secured">
<security mode="TransportWithMessageCredential">
<message clientCredentialType="UserName" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="securedService">
<serviceMetadata httpsGetEnabled="true" />
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="Custom" userNamePasswordValidator="..." />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="..." behaviorConfiguration="securedService">
<endpoint address="" contract="..." binding="basicHttpBinding" bindingConfiguration="secured" />
<endpoint address="mex" contract="IMetadataExchange" binding="mexHttpsBinding" />
</service>
</services>
客户端将使用类似的设置:
<bindings>
<basicHttpBinding>
<binding name="secured">
<security mode="TransportWithMessageCredential">
<message clientCredentialType="UserName" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint name="..." address="https://..." contract="..." binding="basicHttpBinding" bindingConfiguration="secured" />
</client>
此配置定义符合 HTTPS 传输并受用户名和密码保护的 SOAP 1.1 服务。服务还通过 HTTPS 公开其元数据 (WSDL)。用户名和密码由自定义密码验证器验证(您必须implement one)。
您将在客户端设置凭据(由添加服务引用生成):
var client = new MyServiceClient();
client.ClientCredentials.UserName.UserName = "Name";
client.CleintCredentials.UserName.Password = "Password";
消息的加密是在传输层完成的。每次创建新代理时都必须配置凭据,但它们会重复用于来自代理的所有调用。
您的方案可能不需要 WsHttpBinding。设置 ProtectionLevel 仅用于消息级别的安全性 - 我认为这不是您想要的。
不要使用您描述的自定义身份验证:
身份验证方案将验证
用户/第一次通过
验证。那么从那时起
客户端将使用随机生成的
代码作为他们的身份验证。
这要复杂得多。您将推出自己的非标准解决方案,或者您将使用 WCF 的内置实现(安全对话),但并非每个客户端 SOAP 堆栈都能够使用此类服务(它完全依赖于高级消息安全性)。