我正在运行一个WCF服务,除其他外,它用作网站的后端。因为网站和WCF服务都在同一台机器上运行,并且为了性能,我使用netTcpBinding进行设置。
现在的问题是,因为它们存在于同一个盒子里,所以我真的不关心传输级安全性或消息级加密;消息被截获的唯一可能方式是,如果有人进入Web服务器本身,如果他们这样做,我已经遇到了更大的问题。
所以我的问题是:当客户端和服务器已经在受信任的子系统上时,可以使用什么配置来确保netTcpBinding尽可能快?
当然答案可能是使用“无”的安全性。但在我的特定情况下,我仍然需要对自定义数据库使用UserName身份验证。是否可以配置它以便仍然使用UserName身份验证,但不打扰证书或保护端点之间的数据?或者我是否需要使用自定义SOAP标头实现自定义行为来存储用户名/密码,然后我真的可以将安全性设置为“none”?
服务器配置
<netTcpBinding>
<binding name="Net_Tcp_Binding">
<security mode="Message">
<message clientCredentialType="UserName" />
</security>
</binding>
</netTcpBinding>
它使用自定义UserName身份验证 - 基本上每个调用都会验证&amp;授权自定义数据库。服务方还使用证书与其客户进行协商,例如:
<serviceBehaviors>
<behavior name="MyBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceAuthorization principalPermissionMode="Custom">
<authorizationPolicies>
<add policyType="MyAssembly.CustomAuthorizationPolicy,MyAssembly" />
</authorizationPolicies>
</serviceAuthorization>
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="MyAssembly.CustomCredentialValidator,MyAssembly" />
<serviceCertificate x509FindType="FindBySubjectName" findValue="CN=servercert" storeLocation="LocalMachine" storeName="My" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
客户端配置
<netTcpBinding>
<binding name="Net_Tcp_Endpoint">
<reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
<security mode="Message">
<message clientCredentialType="UserName" />
</security>
</binding>
</netTcpBinding>
答案 0 :(得分:4)
“无”将是最快的,是的:-)
另一方面,如果您的服务和后端在同一台计算机上运行,您还应该仔细查看netNamedPipe绑定,如果您有“在机器上”通信,这是绝对最佳的。它比netTcp更快,更高效。
为了根据服务验证调用者,您需要使用某种安全方法 - 因为netNamedPipe仅支持“none”或“Windows”,所以我选择Windows。如果您使用none,则无法识别(验证)呼叫者,因此,您无法根据呼叫者的身份获得授权(谁可以做什么)。
一旦您验证了调用者(他正在给我打电话),那么您可以使用Windows组或内置的ASP.NET成员资格/角色提供程序子系统来执行基于角色的授权,以确保谁可以做什么操作。这可以使用服务配置的行为部分中名为<serviceAuthoritzation>
的服务行为进行配置。
马克