这是我的方案和问题:
我尝试在网上寻找一个好的资源,但是大多数都是不完整的,彼此不同,他们并没有真正混合搭配。我希望使用WCF服务从我的客户端/服务器加密传递消息。我也将实现一些自定义身份验证方案。验证方案将验证用户/第一次验证时的传递。然后,从那时起,客户端将使用随机生成的代码作为其身份验证。
从我收集的内容中,我需要做以下事情:
[ServiceContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
这是我有点不知所措的地方。有太多的消息来源说明服务器和客户端的配置文件应该是什么,我真的很困惑。我的服务器/客户端配置文件应该是什么样的,以便我的服务发送/接收加密的消息并指向自定义身份验证?
<小时/> 或者,如果我不能将此自定义身份验证用作WCF客户端对象的参数,只要邮件已加密,我就会将身份验证凭据作为邮件本身的一部分传递。
如果有一个实际的,完全完整(即非部分信息)资源,那将是很好的。或者,如果有人知道要使用的必要客户端/服务器App.config / Web.config设置也会很棒。
答案 0 :(得分:0)
我相信你想使用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服务,并受用户名和密码保护。 Service还通过HTTPS公开其元数据(WSDL)。用户名和密码由自定义密码验证程序验证(您必须implement one)。
您将在客户端上设置凭据(由添加服务引用生成):
var client = new MyServiceClient();
client.ClientCredentials.UserName.UserName = "Name";
client.CleintCredentials.UserName.Password = "Password";
消息加密在传输层完成。每次创建新代理时都必须配置凭据,但是它们将被重用于代理的所有呼叫。
您的方案可能不需要WsHttpBinding。设置ProtectionLevel
仅用于消息级安全性 - 我认为这不是您要查找的内容。
请勿使用您所描述的自定义身份验证:
验证方案将验证 用户/第一次传递 认证。然后从那时起 客户端将使用随机生成的 代码作为他们的身份验证。
它要复杂得多。您将推出自己的非标准解决方案,或者您将使用WCF的内置实现(安全对话),但并非每个客户端SOAP堆都能够使用此类服务(它完全依赖于高级消息安全性)。 p>