对于WebService调用,为了验证调用者的身份,可以自定义一个SoapHeader,让调用者将身份信息放在里面,然后在服务端检查,具体方法如下:
1、先定义一个SoapHeader,用它来传递身份信息:
using System; using System.Web.Services.Protocols; namespace CustomSoap { /// <summary> /// 自定义SOAP头,从SoapHeader派生 /// </summary> public class ServiceHeader : SoapHeader { /// <summary> /// 定义用户名字段 /// </summary> public string Name { get; set; } /// <summary> /// 定义密码字段 /// </summary> public string Pass { get; set; } } }
2、WebService中的服务方法要修改一下:
using System; using System.Web.Services; using System.Web.Services.Protocols; namespace CustomSoap { [WebService(Namespace = "CustomSoap.Test")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] public class Service : System.Web.Services.WebService { /// <summary> /// 定义一个ServiceHeader对象 /// </summary> public ServiceHeader Header { get; set; } /// <summary> /// 服务方法,用SoapHeader标记使用哪个头,此处是上面定义的Header属性 /// </summary> /// <returns></returns> [WebMethod] [SoapHeader("Header")] public string Hello() { string user = this.Header.Name; string pass = this.Header.Pass; //在此处可以进行身份判断,这里是写死了用户名密码 if(string.Equals(user, "root") && string.Equals(pass, "pass")) return "Hello root"; else return "Login Required"; } } }
3、调用者要传递身份信息:
public string CallHello() { //ServiceProxy是针对Service.asmx生成的代理类 var proxy = new CustomSoap.Remote.ServiceProxy(); //传递身份信息 proxy.ServiceHeaderValue = new CustomSoap.Remote.ServiceHeader(); proxy.ServiceHeaderValue.Name = "root"; proxy.ServiceHeaderValue.Pass = "pass"; //调用远程方法 return proxy.Hello(); }
调用一下,应该能收到“Hello root”,如果用户名或密码错误,会收到“Login Required”。
此时的SOAP内容会发生变化,抓一下包或者直接在浏览器上访问Service.asmx?op=Hello,可以看到请求包:
POST /Service.asmx HTTP/1.1 Host: localhost Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "CustomSoap.Test/Hello" <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <!--这里多出来了Header,内容就是我们自定义的ServiceHeader--> <soap:Header> <ServiceHeader xmlns="CustomSoap.Test"> <Name>string</Name> <Pass>string</Pass> </ServiceHeader> </soap:Header> <!--END--> <soap:Body> <Hello xmlns="CustomSoap.Test" /> </soap:Body> </soap:Envelope>
另外提一下,对于WebService,是明文的SOAP通讯,安全性上需要各位自己考虑一下方案。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。