📜  WCF-安全性(1)

📅  最后修改于: 2023-12-03 15:35:39.845000             🧑  作者: Mango

WCF安全性

WCF(Windows Communication Foundation)是一个基于.net的框架,已被广泛用于分布式系统中的服务端和客户端应用程序间的通信。 在实际应用中,确保通信的安全性至关重要。本文将介绍WCF中可用的一些安全机制以及它们的使用方法。

1. 传输层安全(TLS/SSL)

TLS(Transport Layer Security )和SSL(Secure Sockets Layer)是常见的加密协议,用于保证网络通信的安全性。可以配置WCF应用程序使用TLS/SSL以确保数据在网络传输期间的机密性和完整性。

1.1 配置方法

使用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被指定为证书。

1.2 证书

从上面的XML代码中,我们可以看到一个证书,可以为绑定配置安全证书。此证书必须安装在计算机的本地计算机证书仓库中。 示例代码如下:

<behaviors>
  <serviceBehaviors>
    <behavior name="myServiceBehavior">
      <serviceCredentials>
        <serviceCertificate findValue="MyServerCert"
                            storeLocation="LocalMachine"
                            storeName="My"
                            x509FindType="FindBySubjectName"/>
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
</behaviors>
2. Windows身份验证

WCF提供了许多Windows身份验证方法,包括基于它的SSO系统,基于Windows工作组的方法和基于活动目录的方法。

2.1 配置方法

以下是使用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>
2.2 基于角色的授权

可以使用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>
3. 消息安全

消息安全(Message security)是通过加密整个WCF消息实现的,以确保消息的机密性,完整性和身份验证。

以下是一个示例代码块,用于通过消息安全使用WCF。

<wsHttpBinding>
      <binding name="MyBinding">
        <security mode="Message">
          <message clientCredentialType="Windows" />
        </security>
      </binding>
</wsHttpBinding>
3.1 自定义用户名和密码

可以使用用户名和密码来实现WCF服务端口上的身份验证。通过设置用户名和密码,可以实现对各种服务的身份验证机制。

以下是一个通过自定义用户名和密码使用WCF的示例代码块。

<serviceCredentials>
   <userNameAuthentication userNamePasswordValidationMode="Custom"
                            customUserNamePasswordValidatorType="MyService.CustomUserNameValidator,MyService"/>
</serviceCredentials>

以上示例代码中,设置服务凭证和userNameAuthentication元素,以便可以在WCF中使用自定义用户名和密码验证。