Web service调用的安全性
最近在项目中开发了一个web service,开发完后发现一个很大的安全性问题,并且这个问题好像在旧的项目web service当中并没有注意点,那就是调用的安全性,只要知道URL的人都可以直接调用了,这样要是碰到有人恶意调用就挂了。
后来查阅相关资料,发现了System.Web.Services.Protocols.SoapHeader这个东西,可以让用户必须通过指定口令来访问web服务接口。
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 90 }
2.定义必须进行SoapHeader验证的web service接口方法:
/// <summary> /// Service1 的摘要说明 /// </summary> [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必须先进行口令验证,通过验证才能调用,这样就可以简单而安全地解决问题了。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。