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

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

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

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

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

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

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

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


1.Web Service实现步骤

  首先引入命名空间

  1. using System; 
  2. using System.Collections; 
  3. using System.ComponentModel; 
  4. using System.Data; 
  5. using System.Diagnostics; 
  6. using System.Web; 
  7. using System.Web.Services; 
  8. using System.Web.Services.Protocols;  //对soap Head引用添加的命名空间 

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

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

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

  1. /// <summary> 
  2.     /// myService 的摘要说明 
  3.     /// </summary> 
  4.     //[WebService(Namespace="http://MyServer/MyWebServices/")] 
  5.     public class myService : System.Web.Services.WebService 
  6.     { 
  7.  
  8.         /// <summary> 
  9.         /// Soap头实例 
  10.         /// </summary> 
  11.         public MyHeader myHeader = new MyHeader();  //实例化SoapHead 
  12.  
  13.         public myService() 
  14.         { 
  15.             //CodeGenerated: 自动生成的代码,该调用是 ASP.NET Web 服务设计器所必需的 
  16.             InitializeComponent(); 
  17.         } 
  18.         #region 组件设计器生成的代码 
  19.         //Web 服务设计器所必需的 
  20.         private IContainer components = null
  21.  
  22.         /// <summary> 
  23.         /// 设计器支持所需的方法 - 不要使用代码编辑器修改 
  24.         /// 此方法的内容。 
  25.         /// </summary> 
  26.         private void InitializeComponent() 
  27.         { 
  28.  
  29.         } 
  30.  
  31.         /// <summary> 
  32.         /// 清理所有正在使用的资源 
  33.         /// </summary> 
  34.         protected override void Dispose(bool disposing) 
  35.         { 
  36.             if (disposing && components != null
  37.             { 
  38.                 components.Dispose(); 
  39.             } 
  40.             base.Dispose(disposing); 
  41.         } 
  42.         #endregion 
  43.         // WEB 服务示例 
  44.         // HelloWorld() 示例服务返回字符串 Hello World 
  45.         // 若要生成,请取消注释下列行,然后保存并生成项目 
  46.         // 若要测试此 Web 服务,请按 F5 键 
  47.  
  48.  
  49.         /// <summary> 
  50.         /// 正常调用的方法 
  51.         /// </summary> 
  52.         /// <returns></returns> 
  53.         [WebMethod] 
  54.         public string HelloWorld() 
  55.         { 
  56.             return "Hello World"
  57.         } 
  58.  
  59.         /// <summary> 
  60.         /// 需要验证的方法,添加SoapHeader标识 
  61.         /// </summary> 
  62.         /// <param name="contents"></param> 
  63.         /// <returns></returns> 
  64.         [SoapHeader("myHeader")] 
  65.         [WebMethod(Description = "HelloWord", EnableSession = true)] 
  66.         public string HelloWorld2(string contents) 
  67.         { 
  68.             string msg = ""
  69.             //验证是否有权访问 
  70.             if (!myHeader.IsValid(out msg)) 
  71.                 return msg; 
  72.  
  73.             return "Hello World:" + contents; 
  74.         } 
  75.     } 

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

  1. //创建myService对象 
  2. StudySoapHead.myService service =  new StudySoapHead.myService(); 
  3. //创建soap头对象 
  4. StudySoapHead.MyHeader header=new StudySoapHead.MyHeader(); 
  5. //设置soap头变量  
  6. header.PassWord = "admin";  
  7. header.UserID = "admin"
  8. service.myHeader = header; 
  9. //调用web 方法 
  10. Console.WriteLine(service.HelloWorld()); 
  11. Console.WriteLine(service.HelloWorld2("Valid request!")); 
  12. Console.Read(); 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值