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

7.9  如何保证Web Service的安全

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

是谁调用?--SoapHeader身份认证。

来自哪里?--访问IP认证。

加密传输 --SSL安全访问。

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

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

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


1.Web Service实现步骤

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

  1. //<summary>  
  2. //定义自己的SoapHeader派生类  
  3. //</summary>  
  4. public class MySoapHeader : System.Web.Services.Protocols.SoapHeader  
  5. {  
  6.     private string _UserID = string.Empty;  
  7.     private string _PassWord = string.Empty;  
  8.     //<summary>  
  9.     //构造函数  
  10.     //</summary>  
  11.     public MySoapHeader()  
  12.     {  
  13.     }  
  14.     //<summary>  
  15.     //构造函数  
  16.     //</summary>  
  17.     //<param name="nUserID">用户ID</param>  
  18.     //<param name="nPassWord">加密后的密码</param>  
  19.     public MySoapHeader(string nUserID, string nPassWord)  
  20.     {  
  21.         Initial(nUserID, nPassWord);  
  22.     }  
  23.     #region 属性  
  24.     //<summary>  
  25.     //用户名  
  26.     //</summary>  
  27.     public string UserID  
  28.     {  
  29.         get { return _UserID; }  
  30.         set { _UserID = value; }  
  31.     }  
  32.     //<summary>  
  33.     //加密后的密码  
  34.     //</summary>  
  35.     public string PassWord  
  36.     {  
  37.         get { return _PassWord; }  
  38.         set { _PassWord = value; }  
  39.     }          
  40.     #endregion  
  41.     #region 方法  
  42.     //<summary>  
  43.     //初始化  
  44.     //</summary>  
  45.     //<param name="nUserID">用户ID</param>  
  46.     //<param name="nPassWord">加密后的密码</param>  
  47.     private void Initial(string nUserID, string nPassWord)  
  48.     {  
  49.         UserID = nUserID;  
  50.         PassWord = nPassWord;  
  51.     }  
  52.     //<summary>  
  53.     //验证用户名密码是否正确  
  54.     //</summary>  
  55.     //<param name="nUserID">用户ID</param>  
  56.     //<param name="nPassWord">加密后的密码</param>  
  57.     //<param name="nMsg">返回的错误信息</param>  
  58.     //<returns>用户名密码是否正确</returns>  
  59.     private bool IsValid(string nUserID, string nPassWord, out string nMsg)  
  60.     {  
  61.         nMsg = "";  
  62.         try 
  63.         {  
  64.             //判断用户名密码是否正确   
  65.             if (nUserID == "admin" && nPassWord == "admin")  
  66.             {  
  67.                 return true;  
  68.             }  
  69.             else 
  70.             {  
  71.                 nMsg = "对不起,你无权调用此Web服务。";  
  72.                 return false;  
  73.             }  
  74.         }  
  75.         catch 
  76.         {  
  77.             nMsg = "对不起,你无权调用此Web服务。";  
  78.             return false;  
  79.         }  
  80.     }  
  81.     //<summary>  
  82.     //验证用户名密码是否正确  
  83.     //</summary>  
  84.     //<returns>用户名密码是否正确</returns>  
  85.     public bool IsValid(out string nMsg)  
  86.     {  
  87.         return IsValid(_UserID, _PassWord, out nMsg);  
  88.     }  
  89.     #endregion  

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

  1. //<summary>  
  2. //通过SoapHeader来增强Web Service的安全性  
  3. //</summary>  
  4. [WebService(Namespace = "http://tempuri.org/")]  
  5. [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]  
  6. [ToolboxItem(false)]  
  7. public class WebService_Soap : System.Web.Services.WebService  
  8. {  
  9.     //声明Soap头实例  
  10.     public MySoapHeader myHeader = new MySoapHeader();          
  11.  
  12.     //普通方法,不需要SoapHeader验证  
  13.     [WebMethod(Description = "根据产品编号查询产品的价格")]  
  14.     public string GetProductPrice(string ProductId)  
  15.     {  
  16.         Products pro = new Products();  
  17.         return pro.GetPrice(ProductId);  
  18.     }  
  19.     //需要SoapHeader验证  
  20.     [SoapHeader("myHeader")]  
  21.     [WebMethod(Description="根据产品编号查询产品的价格", EnableSession = true)]  
  22.     public string GetProductPrice2(string ProductId)  
  23.     {  
  24.         string msg = "";  
  25.         //验证是否有权访问  
  26.         if (!myHeader.IsValid(out  msg))  
  27.         {  
  28.             return msg;//返回错误信息  
  29.         }  
  30.         Products pro = new Products();  
  31.         return pro.GetPrice(ProductId);  
  32.     }                

2.客户端调用具有SoapHeader的Web Service

  1. //创建myService对象  
  2. ProductServiceSoap.WebService_Soap service =  
  3.  
  4.     new ProductServiceSoap.WebService_Soap();  
  5. //创建soap头对象  
  6. ProductServiceSoap.MySoapHeader header=new ProductServiceSoap.MySoapHeader();  
  7. //设置soap头变量  
  8. header.PassWord = "admin";  
  9. header.UserID = "admin";  
  10. service.MySoapHeaderValue = header;  
  11. //调用web 方法  
  12. string strPrice = service.GetProductPrice2("001"); 

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

posted @ 2012-02-06 14:28  ^_^肥仔John  阅读(290)  评论(0编辑  收藏  举报