• 如何保证Web Service的安全


    转载自:http://www.cnblogs.com/jiapengliang2005/articles/1619233.html 

      要以安全的方式访问Web服务方法,可以考虑以下安全措施:

    l         是谁调用?——SoapHeader身份认证。

    l         来自哪里?——访问IP认证。

    l         加密传输 ——SSL安全访问。

    这些安全保护措施常常是配合使用的。

    7.9.1  通过SoapHeader来增强Web Service的安全性

    通过SoapHeader我们可以让具有指定用户口令的用户来访问我们的Web服务接口。(完整代码示例位置:光盘\code\ch07\WebAppClient\WebForm-SoapHeader.aspx)

    1.Web Service实现步骤

    (1)定义自己的SoapHeader派生类。

    //<summary>

    //定义自己的SoapHeader派生类

    //</summary>

    public class MySoapHeader : System.Web.Services.Protocols.SoapHeader

    {

        private string _UserID = string.Empty;

        private string _PassWord = string.Empty;

        //<summary>

        //构造函数

        //</summary>

        public MySoapHeader()

        {

        }

        //<summary>

        //构造函数

        //</summary>

        //<param name="nUserID">用户ID</param>

        //<param name="nPassWord">加密后的密码</param>

        public MySoapHeader(string nUserID, string nPassWord)

        {

            Initial(nUserID, nPassWord);

        }

        #region 属性

        //<summary>

        //用户名

        //</summary>

        public string UserID

        {

            get { return _UserID; }

            set { _UserID = value; }

        }

        //<summary>

        //加密后的密码

        //</summary>

        public string PassWord

        {

            get { return _PassWord; }

            set { _PassWord = value; }

        }       

        #endregion

        #region 方法

        //<summary>

        //初始化

        //</summary>

        //<param name="nUserID">用户ID</param>

        //<param name="nPassWord">加密后的密码</param>

        private void Initial(string nUserID, string nPassWord)

        {

            UserID = nUserID;

            PassWord = nPassWord;

        }

        //<summary>

        //验证用户名密码是否正确

        //</summary>

        //<param name="nUserID">用户ID</param>

        //<param name="nPassWord">加密后的密码</param>

        //<param name="nMsg">返回的错误信息</param>

        //<returns>用户名密码是否正确</returns>

        private bool IsValid(string nUserID, string nPassWord, out string nMsg)

        {

            nMsg = "";

            try

            {

                //判断用户名密码是否正确

                if (nUserID == "admin" && nPassWord == "admin")

                {

                    return true;

                }

                else

                {

                    nMsg = "对不起,你无权调用此Web服务。";

                    return false;

                }

            }

            catch

            {

                nMsg = "对不起,你无权调用此Web服务。";

                return false;

            }

        }

        //<summary>

        //验证用户名密码是否正确

        //</summary>

        //<returns>用户名密码是否正确</returns>

        public bool IsValid(out string nMsg)

        {

            return IsValid(_UserID, _PassWord, out nMsg);

        }

        #endregion

    }

    (2)添加基于SoapHeader验证的Web Service接口方法:

    //<summary>

    //通过SoapHeader来增强Web Service的安全性

    //</summary>

    [WebService(Namespace = "http://tempuri.org/")]

    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

    [ToolboxItem(false)]

    public class WebService_Soap : System.Web.Services.WebService

    {

        //声明Soap头实例

        public MySoapHeader myHeader = new MySoapHeader();       

        //普通方法,不需要SoapHeader验证

        [WebMethod(Description = "根据产品编号查询产品的价格")]

        public string GetProductPrice(string ProductId)

        {

            Products pro = new Products();

            return pro.GetPrice(ProductId);

        }

        //需要SoapHeader验证

        [SoapHeader("myHeader")]

        [WebMethod(Description="根据产品编号查询产品的价格", EnableSession = true)]

        public string GetProductPrice2(string ProductId)

        {

            string msg = "";

            //验证是否有权访问

            if (!myHeader.IsValid(out  msg))

            {

                return msg;//返回错误信息

            }

            Products pro = new Products();

            return pro.GetPrice(ProductId);

        }             

    }

    圆角矩形: 代码示例:2.客户端调用具有SoapHeader的Web Service

                                                           (示例位置:光盘\code\ch07)

    //创建myService对象

    ProductServiceSoap.WebService_Soap service =

            new ProductServiceSoap.WebService_Soap();

    //创建soap头对象

    ProductServiceSoap.MySoapHeader header=new ProductServiceSoap.MySoapHeader();

    //设置soap头变量

    header.PassWord = "admin";

    header.UserID = "admin";

    service.MySoapHeaderValue = header;

    //调用web 方法

    string strPrice = service.GetProductPrice2("001");

    通过SoapHeader对用户口令进行验证,只有授权的用户才可以使用该接口。确保了访问接口用户的安全性。

    7.9.2  采用SSL实现加密传输

    在默认情况下,IIS使用HTTP协议以明文形式传输数据,Web Service就是使用HTTP协议进行数据传输的。Web Service传输的数据是XML格式的明文。没有采取任何加密措施,用户的重要数据很容易被窃取,如何才能保护网络中传递的这些重要数据呢?

    SSL(Security Socket Layer)的中文全称是加密套接字协议层,它位于HTTP协议层和TCP协议层之间,用于建立用户与服务器之间的加密通信,确保所传递信息的安全性,同时SSL安全机制是依靠数字证书来实现的。

    SSL基于公用密钥和私人密钥,用户使用公用密钥来加密数据,但解密数据必须使用相应的私人密钥。使用SSL安全机制的通信过程如下:用户与IIS服务器建立连接后,服务器会把数字证书与公用密钥发送给用户,用户端生成会话密钥,并用公共密钥对会话密钥进行加密,然后传递给服务器,服务器端用私人密钥进行解密,这样,用户端和服务器端就建立了一条安全通道,只有SSL允许的用户才能与IIS服务器进行通信。

    info1.png

    注  意

    SSL网站不同于一般的Web站点,它使用的是“HTTPS”协议,而不是普通的“HTTP”协议。因此它的URL(统一资源定位器)格式为“https://网站域名”。

    下面讲解如何使用SSL来增强IIS服务器和Web Service的通信安全。

    实现步骤如下。

    1.为服务器安装证书服务

    要想使用SSL安全机制功能,首先必须为Windows Server 2003系统安装证书服务。进入“控制面板”,运行“添加或删除程序”,接着进入“Windows组件向导”对话框,如图7-13所示。

    1.jpg

    图7-13  Windows组件向导

    勾选“证书服务”选项,单击“下一步”按钮。

    接着选择CA类型。这里选择“独立根CA”选项,如图7-14所示。单击“下一步”按钮,为自己的CA服务器起名,并设置证书的有效期限,如图7-15所示。

    2.jpg

    图7-14  选择CA类型

    未命名.bmp

    图7-15  设置CA信息

    最后指定证书数据库和证书数据库日志的位置,如图7-16所示,单击“下一步”按钮。

    4.jpg

    图7-16  指定证书数据库

    因为需要复制系统文件,所以需要插入Windows的安装光盘,如图7-17所示。安装证书服务需要停止当前的IIS运行,所以要单击“是”按钮。

    5.jpg

    图7-17  复制系统文件

    最后,显示完成了证书服务的安装,单击“完成”按钮,如图7-18所示。

    7.jpg

    图7-18  安装完成

    2.配置SSL网站

    1)创建请求证书文件

    要想让Web Service使用SSL安全机制,首先需将Web Service配置为网站。然后为该网站创建请求证书文件。

    依次单击“控制面板”→“管理工具”按钮,运行“Internet 信息服务(IIS)管理器”,在管理器窗口中展开“网站”目录,用鼠标右键单击要使用SSL的Web Service网站,在弹出的快捷菜单中选择“属性”命令,在网站属性对话框中切换到“目录安全性”选项卡,如图7-19所示,

    8.jpg

    图7-19  网站属性

    然后单击“服务器证书”按钮,弹出“IIS证书向导”对话框。

    在“IIS证书向导”对话框中选择“新建证书”选项,单击“下一步”按钮,如图7-20所示。

    9.jpg

    图7-20  服务器证书

    选择“现在准备证书请求,但稍后发送”选项。单击“下一步”按钮,如图7-21所示。

    10.jpg

    图7-21  证书向导

    在“名称”输入框中为该证书取名,然后在“位长”下拉列表中选择密钥的位长(默认为1024,长度越长保密性越好,但性能会越差)。单击“下一步”按钮,如图7-22所示。

    11.jpg

    图7-22  设置证书名称

    设置单位信息,如图7-23所示,然后单击“下一步”按钮。设置公共名称,如图7-24所示。

    12.jpg

    图7-23  设置单位信息

    15.JPG

    图7-24  设置公共名称

    info1.png

    注  意

    公共名称必须输入为访问站点的域名,例如要想用地址https://www.maticsoft.com访问Web Service,则此处必须填写为“www.maticsoft.com”,否则将提示使用了不安全的证书,导致站点无法访问。并且切记,www.maticsoft.com和www.maticsoft.com:8001 带端口的访问也是不同的,如果设置的是www.maticsoft.com,则网站设置为www.maticsoft.com:8001来访问也是无法使用的。

    然后,单击“下一步”按钮,设置国家地区,如图7-25所示。

    14.jpg

    图7-25  设置国家地区

    设置证书的单位、部门、站点公用名称和地理信息,一路单击“下一步”按钮。

    最后指定请求证书文件的保存位置。这样就完成了请求证书文件的创建。

    2)申请服务器证书

    完成上述设置后,还要把创建的请求证书文件提交给证书服务器。

    在服务器端的IE浏览器地址栏中输入“http://localhost/CertSrv/default.asp”。

    在“Microsoft  证书服务”欢迎窗口中单击“申请一个证书”链接,如图7-26所示。

    接下来在证书申请类型中单击“高级证书申请”链接,如图7-27所示。

    21.jpg               22.jpg

                    图7-26  申请证书                                图7-27  选择证书类型

    然后在高级证书申请窗口中单击“使用base64编码的CMC或PKCS#10……”链接,如图7-28所示。

    23.jpg

    图7-28  选择编码

    接下来在新打开的窗口中,打开刚刚生成的“certreq.txt”文件,将其中的内容复制到“保存的申请”中,如图7-29所示。

    24.jpg

    图7-29  提交证书申请

    单击“提交”按钮,显示“证书挂起”页面,如图7-30所示。

    25.jpg

    图7-30  证书挂起

    3)颁发服务器证书

    提交证书申请以后,还需要颁发服务器证书。依次选择“开始”→“设置”→“控制面板”,双击“管理工具”,再双击“证书颁发机构”,在打开的对话框中选择“挂起的申请”选项,如图7-31所示。

    26.jpg

    图7-31  挂起的申请

    找到刚才申请的证书,然后用鼠标右键单击该项,在弹出的快捷菜单中选择“所有任务”→“颁发”命令,如图7-32所示。

    颁发成功后,选择“颁发的证书”选项,双击刚才颁发的证书,在弹出的“证书”对话框中的“详细信息”标签页中,单击“复制到文件”按钮,如图7-33所示。

    27.jpg       28.jpg

    图7-32  颁发证书                             图7-33  复制到文件

    弹出“证书导出向导”对话框,连续单击“下一步”按钮,选择“Base64编码X.509”选项,如图7-34所示。

    图7-34  选择导出文件格式

    单击“下一步”按钮,并在“要导出的文件”对话框中指定文件名,最后单击“完成”按钮。

    4)安装Web服务器证书

    重新进入IIS管理器的“目录安全性”标签页,单击“服务器证书”按钮,弹出“挂起的证书请求”对话框,选择“处理挂起的请求并安装证书”选项,单击“下一步”按钮,如图7-35所示。

    31.jpg

    图7-35  处理挂起的证书

    指定刚才导出的服务器证书文件的位置,如图7-36所示。

    32.jpg

    图7-36  选择导出位置

    接着设置SSL端口,使用默认的“443”即可,最后单击“完成”按钮。

    5)配置网站启用SSL通道

    在网站属性“目录安全性”标签页中单击安全通信栏的“编辑”按钮,然后,勾选“要求安全通道(SSL)”选项,如图7-37所示。

    33.jpg

    图7-37  启用网站SSL通道

    l         忽略客户端证书:选择该选项可以允许用户不必提供客户端证书就可访问该站点。

    l         接受客户端证书:选择该选项可以允许具有客户端证书的用户进行访问,证书不是必需的。具有客户端证书的用户可以被映射;没有客户端证书的用户可以使用其他身份验证方法。

    l         要求客户端证书:选择该选项则仅允许具有有效客户端证书的用户进行连接。没有有效客户端证书的用户被拒绝访问该站点。选择该选项从而在要求客户端证书前,必须选择“要求安全通道(SSL)”选项。

    最后单击“确定”按钮,即完成启用SSL了。在完成了对SSL网站的配置后,用户只要在IE浏览器中输入“https://网站域名”就能访问该网站。

    info1.png

    注  意

    l         勾选上SSL后,必须用HTTPS来访问,而访问网站的端口也会使用SSL端口,默认为443。

    l         如果在你访问站点的过程中出现无法正常访问的情况,那么请检查服务器防火墙是否禁止对SSl端口443的访问,这点比较容易被忽视,当然你也可以自己修改端口。

    l         如果还是不能访问,出现提示“你试图从目录中执行 CGI、ISAPI 或其他可执行程序,但该目录不允许执行程序。HTTP错误403.1—禁止访问:执行访问被拒绝。”那么请检查网站主目录的执行权限,将执行权限设置为纯脚本即可,如图7-38所示。

    35.JPG

    图7-38  设置执行权限

    6)客户端安装证书

    如果IIS服务器设置了“要求客户端证书”,则其他机器或用户想通过HTTPS访问和调用该Web服务,就需要将CA的根证书导入到客户端证书的可信任机构中,客户端才可以正常访问Web服务。

    (1)选择“开始”→“运行”命令,在弹出的对话框中输入“mmc”,出现如图7-39所示的界面。

    41.JPG

    图7-39  启动控制台

    (2)选择“文件”→“添加/删除管理单元”命令,出现如图7-40所示的界面。

    42.JPG

    图7-40  添加/删除管理单元

    (3)单击“添加”按钮,在可用独立管理单元列表中选择“证书”选项,出现如图7-41所示的界面。

    (4)选择“计算机账户”选项,单击“下一步”按钮,选择“本地计算机”选项,然后依次单击“完成”→“关闭”→“确定”按钮。

    44.jpg

    图7-41  添加证书管理单元

    进入当前用户的证书管理单元,界面如图7-42所示。

    46.JPG

    图7-42  选择证书导入位置

    选中“个人”下的“证书节点”选项,单击鼠标右键,在弹出的快捷菜单中选择“所有任务”→“导入”命令,如图7-43所示。

    45.jpg

    图7-43  导入证书

    选择我们刚才颁发的服务器证书cert.cer,将其导入到个人的存储位置,导入后如图7-44所示。

    47.JPG

    图7-44  导入到证书

    7)SSL的优点与缺点

    l         优点:它对Web服务提供的数据完整性没有任何影响,当值返回给客户时,值还是保持原样,并没有因在传输过程中使用了加密技术而发生变化。

    l         缺点:它对站点的整体性能有影响,因为它需要进行很多加解密的数据处理。

    7.9.3  访问IP限制

    圆角矩形: 代码示例:除了以上两种方式以外,还有一种比较简单的验证方式,就是通过对来源IP的检查来进行验证,我们只允许指定IP的服务器来访问,保证点对点的安全,我们可以在Web Service的方法中加入对IP的检查。

                                                  (示例位置:光盘\code\ch07\WebService1)

    bool ValidateIP(int UserID, out string exceptionInfo)

    {

        exceptionInfo = "";

        string uip = HttpContext.Current.Request.UserHostAddress;

        Common dal = new Common();

        List<string> ips = dal.GetPermitIp(UserID);//得到该用户ID所允许的IP列表

        if (ips == null || ips.Count == 0)

        {

            exceptionInfo = "调用Web服务的客户端IP未被允许,无法访问!";

            return false;

        }

        if (ips.Contains(uip)) //允许IP列表中包含该IP

        {

            return true;

        }

        exceptionInfo = "调用Web服务的客户端IP未被允许,无法访问!";

        return false;

    }

    在具体Web方法里调用该方法检查用户访问者是否是以我们允许的IP进行访问的,以确保安全。

    l         优点:简单,防止非指定客户机器访问。

    l         缺点:IP是可以伪造的;维护IP地址表比较烦琐。且只适合于固定IP访问者的情况。

    总之,上面几种方式只是一个简单的示例,讲解了怎样通过编程和配置的方式拒绝没有合法验证单据的客户端访问Web Service来保护你的Web Service。在你的安全模型中要求的复杂级别应该由你的商业需求决定。可以是一种或几种验证机制的组合。当然并不是所有的Web应用程序都需要上面的安全模式,尤其是当你的Web Service可以自由使用的时候,并不需要上面的安全机制处理。

  • 相关阅读:
    Net设计模式实例之简单工厂模式(Simple Factory Pattern)
    Net设计模式实例系列文章总结
    2019年工作总结
    在Asp.Net Core中集成Kafka(中)
    如何将生产环境的服务Docker镜像拉取到本地进行调试
    记一次EFCore类型转换错误及解决方案
    Asp.Net Core中创建多DbContext并迁移到数据库
    ABP中的AutoMapper
    EFCore中的导航属性
    Asp.Net Core 调用第三方Open API查询物流数据
  • 原文地址:https://www.cnblogs.com/colder/p/2528723.html
Copyright © 2020-2023  润新知