如何保证Web Service的安全

  要以安全的方式访问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

//创建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服务器进行通信。

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

实现步骤以后更新。


猜你喜欢

转载自blog.csdn.net/ibenxiaohai123/article/details/80997167