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必须先进行口令验证,通过验证才能调用,这样就可以简单而安全地解决问题了。

Web service调用的安全性,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。