思路:
web服務使用雖然方便,但安全是個問題,在企業開發中,經常面臨多界面的客戶端,使用你的服務的可能是個桌面程序也可能是個移動應用,這就要求集中的身份驗證,而web服務來做這個事情是最合適不過的。我們先來用一個UserLoginInfo來保存登陸用戶的令牌(token),主機地址(host)和安全上下文(IPrincipal),當然了真實環境中這些東西肯定應該是保存在數據庫中的,然后寫個sql job來定時清理過時的令牌。我們首先要寫個身份驗證的web服務(AuthenticateService.asmx),此服務用來進行身份驗證,令牌檢測,用戶注銷,獲取安全上下文等功能。然后我們要開發一個業務服務的基類(ServiceBase.cs),因為調用每個業務服務的時候要保證這個調用是授權的,所以有好多共性的東西,所以我們提取一個基類出來,它主要有驗證令牌,角色檢驗,注銷等方法。因為web服務是無狀態的,所以我們要用SOAP頭來傳遞令牌,這樣我們要定義一個tokenHeader的SOAP頭,并把它聲明在每個需要身份驗證的web方法前。這樣你就可以開發你的安全的業務服務了。
流程是這樣的,你要使用一個業務服務,首先從身份驗證服務那里進行身份驗證,這時候會身份驗證服務返回一個令牌,并把這個令牌和你的主機IP保存在UserLoginInfo的字典類里,你獲取到這個這個令牌后把它緩存起來,然后在調用業務服務的時候把令牌賦值給SOAP頭,它會自動傳遞。業務服務收到你的調用后,首先會調用基類的身份驗證方法看看這個令牌是否合法(UserLoginInfo類里是否保存有這個令牌),然后檢查你的IP是否和此令牌匹配,如果完全檢查通過再讓你使用實際的業務服務,否則會拋出Web異常,然后包裝成SOAP異常,你客戶端獲取SOAP異常后再進行解析成友好的錯誤提示。
下載地址:http://www.cnblogs.com/Files/onlytiancai/EnterpriseDev.rar
簡介:
思路介紹完了,簡單介紹一下如何實現的,下面是一個業務服務方法
EntitySerializer es = new EntitySerializer(EntitySerializeType.Xml);
[WebMethod]
[SoapHeaderAttribute("Token",
Direction = SoapHeaderDirection.In)]
public string GetAllOrders()
{
Authenticate();
return es.SerializeArray(service.GetAllOrders());
}
可以看到調用它需要傳送一個SOAP頭,這個SOAP頭會填充私有變量Token(簡單起見,令牌用GUID格式),然后調用基類的Authenticate()方法進行身份檢查,檢查通過后調用實際的業務邏輯。
注意:
1、NBear的持久層返回的實體都是接口,接口是不可以直接序列化的,所以不能通過WEB服務傳遞,這樣就需要使用NBear的使用函數來把返回接口序列化成字符串再傳遞,然后客戶端也用此類來解序列化。
2、web服務的令牌用SOAP可以簡單的傳遞,如果是Remoting的話用System.Runtime.Remoting.Messaging.CallContext.SetData()和GetData()讓令牌自動在上下文中傳遞。
再看看客戶端如何調用,我們用一個winform窗體TestWebService.cs(TestApp項目)來演示。
//調用身份驗證服務進行身份驗證并緩存令牌
loginToken = service.Authenticate(txtName.Text, txtPassword.Text);
//實例化業務服務,創建SOAP頭,并給SOAP頭用緩存的令牌賦值
usefulService = new TestApp.OrderOperator.OrderService();
usefulService.TokenHeaderValue = new TestApp.OrderOperator.TokenHeader();
usefulService.TokenHeaderValue.InnerToken = loginToken;
//使用業務服務獲取數據并解序列化成接口實體數組,最后綁定到控件上
orders = es.DeserializeArray(usefulService.GetAllOrders());
listOrders.DisplayMember = "OrderID";
listOrders.DataSource = orders;
注釋寫的很清楚了,不多說了,更詳細的演示看下載的代碼。
這次更新的代碼又添加了以下幾項技術。
1、winform2.0的TableLayoutPanel控件的使用
2、SOAP頭的使用
3、SOAP異常的包裝
4、NBear的序列化和解序列化
聲明:演示代碼中的Soap異常的包裝和反包裝是用的zongsoft的
下一步演示是Wap站點和Web門戶,然后再演示remoting的性能計數、跟蹤、授權等技術。


