對于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; }
/// 定義密碼字段
public string Pass { get; set; }
}
}
2、WebService中的服務方法要修改一下:
using System.Web.Services;
[WebService(Namespace = "CustomSoap.Test")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class Service : System.Web.Services.WebService
/// 定義一個ServiceHeader對象
public ServiceHeader Header { get; set; }
/// 服務方法,用SoapHeader标記使用哪個頭,此處是上面定義的Header屬性
/// <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通訊,安全性上需要各位自己考慮一下方案。
本文轉自 BoyTNT 51CTO部落格,原文連結:http://blog.51cto.com/boytnt/837345,如需轉載請自行聯系原作者