最近在项目中开发了一个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 UserID28 {29 get { return _UserID; }30 set { _UserID = value; }31 }32 //33 //加密后的密码 34 // 35 public string PassWord36 {37 get { return _PassWord; }38 set { _PassWord = value; }39 }40 #endregion41 #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 try63 {64 //判断用户名密码是否正确 65 if (nUserID == "admin" && nPassWord == "admin")66 {67 return true;68 }69 else70 {71 nMsg = "对不起,你无权调用此Web服务。";72 return false;73 }74 }75 catch76 {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 #endregion90 }
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必须先进行口令验证,通过验证才能调用,这样就可以简单而安全地解决问题了。