📅  最后修改于: 2023-12-03 15:35:39.845000             🧑  作者: Mango
WCF(Windows Communication Foundation)是一个基于.net的框架,已被广泛用于分布式系统中的服务端和客户端应用程序间的通信。 在实际应用中,确保通信的安全性至关重要。本文将介绍WCF中可用的一些安全机制以及它们的使用方法。
TLS(Transport Layer Security )和SSL(Secure Sockets Layer)是常见的加密协议,用于保证网络通信的安全性。可以配置WCF应用程序使用TLS/SSL以确保数据在网络传输期间的机密性和完整性。
使用TLS/SSL需要在WCF终结点上进行配置,以下是一个对应于HTTPS的示例。
<system.serviceModel>
<services>
<service name="MyService">
<endpoint address="https://localhost/myservice"
binding="basicHttpBinding"
contract="IMyService" />
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="secureBinding">
<security mode="Transport">
<transport clientCredentialType="Certificate" />
</security>
</binding>
</basicHttpBinding>
</bindings>
</system.serviceModel>
以上代码中,指定了HTTPS终结点的地址,并将终结点绑定到基本http绑定。此外,binding元素中的行设置了用于启用TLS/SSL的SecurityMode属性,且clientCredentialType被指定为证书。
从上面的XML代码中,我们可以看到一个证书,可以为绑定配置安全证书。此证书必须安装在计算机的本地计算机证书仓库中。 示例代码如下:
<behaviors>
<serviceBehaviors>
<behavior name="myServiceBehavior">
<serviceCredentials>
<serviceCertificate findValue="MyServerCert"
storeLocation="LocalMachine"
storeName="My"
x509FindType="FindBySubjectName"/>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
WCF提供了许多Windows身份验证方法,包括基于它的SSO系统,基于Windows工作组的方法和基于活动目录的方法。
以下是使用WCF实施Windows身份验证的示例。
<system.serviceModel>
<services>
<service name="MyService">
<endpoint address="http://localhost/myservice"
binding="basicHttpBinding"
contract="IMyService" />
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="secureBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" />
</security>
</binding>
</basicHttpBinding>
</bindings>
</system.serviceModel>
可以使用WCF实现基于角色的授权,这样只有满足特定角色的用户才能访问WCF服务。可以使用角色策略进行此设置。
<system.identityModel>
<identityConfiguration>
<securityTokenHandlers>
<clear />
<add type="System.IdentityModel.Tokens.WindowsUserNameSecurityTokenHandler,
System.IdentityModel.Extensions, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35" />
<add type="System.IdentityModel.Tokens.UserNameSecurityTokenHandler,
System.IdentityModel, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089" />
</securityTokenHandlers>
<audienceUris>
<add value="http://localhost:8080/Myservice" />
</audienceUris>
<issuerNameRegistry>
<trustedIssuers>
<add thumbprint="1234ABCD5678EFGH90"></add>
</trustedIssuers>
</issuerNameRegistry>
<certificateValidation certificateValidationMode="PeerOrChainTrust" />
<identityMappings>
<add name="username" sourceType="System.Security.Principal.WindowsIdentity"
targetClaimType="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"/>
</identityMappings>
</identityConfiguration>
</system.identityModel>
以上代码展示了如何使用角色授权来访问服务。要使用此方法,我们需要在服务模板配置元素中添加一个行。
<authorization>
<deny users="?" />
<allow roles="Administrators" />
<deny users="*" />
</authorization>
消息安全(Message security)是通过加密整个WCF消息实现的,以确保消息的机密性,完整性和身份验证。
以下是一个示例代码块,用于通过消息安全使用WCF。
<wsHttpBinding>
<binding name="MyBinding">
<security mode="Message">
<message clientCredentialType="Windows" />
</security>
</binding>
</wsHttpBinding>
可以使用用户名和密码来实现WCF服务端口上的身份验证。通过设置用户名和密码,可以实现对各种服务的身份验证机制。
以下是一个通过自定义用户名和密码使用WCF的示例代码块。
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType="MyService.CustomUserNameValidator,MyService"/>
</serviceCredentials>
以上示例代码中,设置服务凭证和userNameAuthentication元素,以便可以在WCF中使用自定义用户名和密码验证。