从零开始学WCF(14)WCF安全性概述

安全性概述

常见的安全威胁:

1) 观测网络流量以获取敏感信息。以在线银行为列,某个客户端请求将资金从一个账户转账到另一个账户。一个恶意用户截获了此消息(具有账号和密码),随后从盗用的账户将资金转出。

2) 欺诈性实体在客户端未发觉的情况下其服务的作用。在此情况下,恶意用户(欺诈方)充当在线服务,从客户端截获消息以获取敏感消息。然后,欺诈方使用窃取的数据将资金从盗用的账户转出。此类攻击也称为“钓鱼攻击”。

3) 更改消息以获取与调用方所需的结果不同的结果。例如,更改用于存款的账号以便将资金转移到恶意账户。

4) 黑客重放,恶意黑客重放同一采购订单。例如,一家网上书店收到数百张订单并将书籍发送给未订购这些书籍的客户。

5) 使某项服务无法对客户端进行身份验证。在此情况下,服务无法确保相应人员执行该项事务。


传输安全性可提供下列保障:

1) 服务终结点(响应方)身份验证

2) 客户端主体(发起方)身份验证

3) 消息完整性

4) 消息保密性

5) 重放检测


WCF是一个基于SOAP消息的分布式编程平台,因此保护客户端的服务之间的消息安全对于保护数据非常重要。

WCF基于现有安全性基础架构和SOAP消息的经验证的安全标准提供可互操作的安全消息交换通用平台。

与现有的安全性基础结构集成:

通常,Web服务部署都具有现成的安全性解决方案,例如,安全套接字层(SSL)或Kerberos协议。某些服务则利用已部署的安全性基础结构,例如,使用Active Director的WIndows域。当评估和采用新服务时,通常需要与这些现有技术集成。

WCF安全性与现有传输安全模型集成,并且可对基于SOAP消息安全的新传输安全模型使用现有的基础结构。


与现有身份验证模型集成

任何通信安全模型的一个重要组成部分就是能够识别正在通信的实体并对其进行身份验证。这些通信中的实体使用“数字标识”或凭据向通信对等方验证自己的身份。随着分布式通信平台的发展,以实现多种不同的凭据身份验证和相关的安全模型。

1) 在Internet中,通常使用用户名和密码标识用户。

2) 在Intranet中,使用Kerberos域控制器备份用户和服务身份验证变得越来越普遍。

3) 在业务合作伙伴之间,证书可用于对合作伙伴的身份进行相互验证。

因此,在Web服务领域中,同样的服务可向内部企业客户公开,也可想外部合作伙伴或Internet客户公开,重要的是基础结构可提供与这些现有安全身份验证模型的集成。WCF安全性支持多种凭据类型(身份验证模型),其中包括:

1) 匿名调用方。

2) 用户名客户端凭据。

3) 证书客户端凭据。

4) Windows(Kerberos协议和NT LanMan[NTLM])


WCF安全性的功能划分:

1) 传输安全性:

传输安全性包括三项主要安全功能:完整性、保密性和身份验证。完整性就是检测消息是否已被串改的能力。机密性就是保证除预期接收方之外的其他人员都无法读取某个消息;这可以通过加密技术实现。身份验证就是验证已声明标识的能力。将这三项功能结合在一起,有助于确保消息安全地从一个点到达另一个点。

2) 访问控制:

访问控制也成为身份验证。身份验证使得不同的用户可以具有不同的数据查看权限。

3) 审核:

审核就是将安全事件记录到Windows事件日志中。可以记录与安全相关的事件,例如身份验证失败(或成功)。


传输安全性

三项功能——完整性、保密性和身份验证——合称为传输安全:



使用WCF传输安全的常见方案包括:

1) 使用Windows确保传输安全:

WCF客户端和服务部署在Windows域(或WIndows目录林)中。

2) 使用Username和Https确保传输安全:

客户端凭据根据数据库(其中的内容为用户名/密码对)进行身份验证。服务是用受信任的安全套接字层(SSL)证书部署在一个HTTPS地址的。由于消息是通过Internet传输的,因此,客户端和服务需要相互进行身份验证,并且必须在传输过程中保持消息的保密性和完整性。

3) 使用证书确保传输安全:

客户端和服务都具有可用于确保消息安全的证书。客户端和服务通过Internet进行相互通信,执行要求消息完整性、保密性和相互身份验证的重要事务。


传输安全模式



绑定支持的安全模式:


凭据

凭据是一些数据,用于证实已声明表示或功能。出示凭据的操作包括,同事出示数据和对数据的所有权声明。
例如,考虑WCF中支持的两种凭据类型:
1) 用户名
用户名表示已声明的标识,密码表示所有权证明。这种情况下,受信任的颁发机构则是验证用户名和密码的系统。
2) (X.509)证书凭据
在证书凭据中,主题名称、主题备用名称或证书中的特定字段可用于表示已声明标识和/或功能。凭据中的数据所有权证明的建立,是用关联私钥生成签名实现的。

传输安全模式(Transport)的凭据类型:


消息安全模式(Message)的凭据类型:


传输安全示例(Transport)DEMO

1) 新建一个WCF Application Service项目,然后定义WCF服务接口:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace Video14.Demo1.TransportSecurity
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "ICalculatorService" in both code and config file together.
    [ServiceContract]
    public interface ICalculatorService
    {
        [OperationContract]
        double Add(double n1, double n2);
        [OperationContract]
        double Subtract(double n1, double n2);
        [OperationContract]
        double Multiply(double n1, double n2);
        [OperationContract]
        double Divide(double n1, double n2);
    }
}

2) 实现该服务类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace Video14.Demo1.TransportSecurity
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "CalculatorService" in code, svc and config file together.
    public class CalculatorService : ICalculatorService
    {
        public double Add(double n1, double n2)
        {
            return n1 + n2;
        }

        public double Subtract(double n1, double n2)
        {
            return n1 - n2;
        }

        public double Multiply(double n1, double n2)
        {
            return n1 * n2;
        }

        public double Divide(double n1, double n2)
        {
            return n1 / n2;
        }
    }
}

3) 配置配置文件,在配置文件里指定安全模式为传输安全模式:
<?xml version="1.0"?>
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>

    <services>
      <service name="Video14.Demo1.TransportSecurity.CalculatorService" behaviorConfiguration="CalculatorServiceBehavior">
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="Binding1" contract="Video14.Demo1.TransportSecurity.ICalculatorService"/>
      </service>
    </services>

    <bindings>
      <wsHttpBinding>
        <binding name="Binding1">
          <!--指定在wsHttpBinding基础上使用安全模式为Transport的传输安全模式,所有的安全性都交由传输层来决定,传输层也就是部署方在IIS中进行配置-->
          <security mode="Transport">
            <!--客户端的凭据类型:客户端无需证明自己的身份-->
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    
    <behaviors>
      <serviceBehaviors>
        <behavior name="CalculatorServiceBehavior">
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
  
</configuration>

4) 编辑生成的bin及服务文件,部署到IIS上。
5) 这里由于使用了Transport模式的传输安全,所有需要打开IIS上支持SSL安全套接字层的支持。打开方法:


6) 我们在IIS上,可以用证书来进行安全套接字层的保障,首先我们需要证书,我们创建一个自签名的证书:


7) 创建好证书后,所有在这台IIS上所部署的服务也好,或者是网站应用程序也好,都可以利用这个证书来进行安全套接字层的部署,所有跟这台IIS上面利用HTTS访问的数据交换都会使用这个证书来加密和签名。证书创建好后,需要在网站上添加对HTTS的支持,并且在HTTPS上指定证书为刚刚创建的TestForService证书,这也就保证了所以使用HTTPS来请求这台上的数据都会使用这个证书来签名和加密。


8) 进一步来看看我们具体的应用程序,需要在应用程序上来指定是否使用SSL:

9) 点击SSL设置后,我们设置客户端证书是“忽略”的:


10) 以上设置完毕后,我们来测试一下,在IE中输入“ https://localhost/TransportSecurity/CalculatorService.svc”来打开这个WCF服务,打开的时候会提示一个警报,这事由于浏览器不认识这个证书,这时候我们点击继续浏览此网站即可。打开后我们可以看到这个WCF服务如下:由于我们没有打开mex的Endpoint,所以我发查看到他的WSDL


11) 如果我们在前面的SSL设置上选中了“要求SSL”,而且是“必需的”


那么我们在IE上开打这个WCF服务的时候就会看到“HTTP 错误 403.7 - Forbidden您尝试访问的页面要求您的浏览器具有该 Web 服务器可识别的安全套接字层(SSL)客户证书”


12) 添加一个客户端程序Client,然后使用SVCUTIL控制台程序生成WCF服务的客户端代理类及配置文件(如果生成的时候有问题请参照:http://blog.csdn.net/eric_k1m/article/details/13770043),然后添加到该项目中。在Main方法中进行测试:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Client.ServiceReference1;
using System.Net;
using System.Security.Cryptography.X509Certificates;

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            // WARNING: This code is only needed for test certificates such as those created by makecert. It is 
            // not recommended for production code.
            //证书策略,需要找到CN=Eric-PC.TYCOFS.COM的证书,就相当于认可这个服务,然后才能进行方法的调用
            PermissiveCertificatePolicy.Enact("CN=Eric-PC.TYCOFS.COM");

            // Create a client with given client endpoint configuration
            CalculatorServiceClient client = new CalculatorServiceClient();

            // Call the Add service operation.
            double value1 = 100.00D;
            double value2 = 15.99D;
            double result = client.Add(value1, value2);
            Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);

            // Call the Subtract service operation.
            value1 = 145.00D;
            value2 = 76.54D;
            result = client.Subtract(value1, value2);
            Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);

            // Call the Multiply service operation.
            value1 = 9.00D;
            value2 = 81.25D;
            result = client.Multiply(value1, value2);
            Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);

            // Call the Divide service operation.
            value1 = 22.00D;
            value2 = 7.00D;
            result = client.Divide(value1, value2);
            Console.WriteLine("Divide({0},{1}) = {2}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值