最近在项目中开发了一个web service,开发完后发现一个很大的安全性问题,并且这个问题好像在旧的项目web service当中并没有注意点,那就是调用的安全性,只要知道URL的人都可以直接调用了,这样要是碰到有人恶意调用就挂了。
后来查阅相关资料,发现了System.Web.Services.Protocols.SoapHeader这个东西,可以让用户必须通过指定口令来访问web服务接口。
1.定义SoapHeader派生类:
1 //2 //定义自己的SoapHeader派生类 3 // 4 public class MySoapHeader : System.Web.Services.Protocols.SoapHeader 5 { 6 private string _UserID = string.Empty; 7 private string _PassWord = string.Empty; 8 // 9 //构造函数 10 // 11 public MySoapHeader() 12 { 13 } 14 // 15 //构造函数 16 // 17 //用户ID 18 //加密后的密码 19 public MySoapHeader(string nUserID, string nPassWord) 20 { 21 Initial(nUserID, nPassWord); 22 } 23 #region 属性 24 // 25 //用户名 26 // 27 public string UserID 28 { 29 get { return _UserID; } 30 set { _UserID = value; } 31 } 32 // 33 //加密后的密码 34 // 35 public string PassWord 36 { 37 get { return _PassWord; } 38 set { _PassWord = value; } 39 } 40 #endregion 41 #region 方法 42 // 43 //初始化 44 // 45 //用户ID 46 //加密后的密码 47 private void Initial(string nUserID, string nPassWord) 48 { 49 UserID = nUserID; 50 PassWord = nPassWord; 51 } 52 // 53 //验证用户名密码是否正确 54 // 55 //用户ID 56 //加密后的密码 57 //返回的错误信息 58 // 用户名密码是否正确 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 //82 //验证用户名密码是否正确 83 // 84 // 用户名密码是否正确 85 public bool IsValid(out string nMsg) 86 { 87 return IsValid(_UserID, _PassWord, out nMsg); 88 } 89 #endregion 90 }
2.定义必须进行SoapHeader验证的web service接口方法:
////// Service1 的摘要说明 /// [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] public class Service1 : System.Web.Services.WebService { public MySoapHeader soapheader = new MySoapHeader(); [SoapHeader("soapheader")] [WebMethod(Description = "测试", EnableSession = true)] public string HelloWorld() { string msg = string.Empty; if (soapheader.IsValid(out msg)) { return msg; } ... } }
3.最后一个问题:客户端怎样调用带有SoapHeader验证的web service接口方法呢?如下
yWebReference.Service1 service = new MyWebReference.Service1();//创建service对象 MyWebReference.MySoapHeader head = new MyWebReference.MySoapHeader();//创建SoapHeader对象 //设置SoapHeader变量 head.UserID = "admin"; head.PassWord = "admin1"; service.MySoapHeaderValue = head; string s = service.HelloWorld();//调用web方法
到此完成,通过SoapHeader强行调用web service必须先进行口令验证,通过验证才能调用,这样就可以简单而安全地解决问题了。