一、 概述:
Web Services是由企業發布的完成其特定商務需求的線上應用服務,其他公司或應用軟體能夠透過Internet來存取並使用這項線上服務。它邏輯性的為 其他應用程式提供資料與服務.各應用程式透過網路協定與規定的一些標準資料格式(Http,XML,Soap)來存取Web Service,透過Web Service內部執行得到所需結果。由於它透過internet進行呼叫,必然存在網路使用者都可以呼叫的安全性問題。如何實作webservice的存取 權限限制,是使用webservice使用者使用面臨重要的問題,下文就給兩個方案,從淺到深解決上面問題。
二、基於「soapheader」 特性的簡單方法
1." soapheader" 概述
SOAP 標頭提供了一種方法,用於將資料傳遞到XML Web services 方法或從XML Web services 方法傳遞資料,條件是該資料不直接與XML Web services 方法的主功能相關。 多數情況下用來傳遞使用者身分驗證資訊,當然它的作用遠不止如此,有待於在實際應用中發掘。
2.soapheader實作使用者驗證碼
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; namespace UserCenter { public class MySoapHeader :SoapHeader { public string UserName { get; set; } public string PWD { get; set; } } /// <summary> /// MyMath 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。 // [System.Web.Script.Services.ScriptService] public class MyMath : System.Web.Services.WebService { public MySoapHeader sHeader; [WebMethod] public string HelloWorld() { return "Hello World"; } [WebMethod] [SoapHeader("sHeader")] public string add(int x, int y) { if (sHeader.UserName == "test" && sHeader.PWD == "test") { return (x + y).ToString(); } else { return null; } } } }
3.缺點分析:
(1)服務邏輯與使用者權限驗證邏輯混和,加大程式理解複雜度。
(2)權限邏輯重用性不高
二、基於“SoapExtensionAttribute” 特性的方法
1.SoapExtensionAttribute與SoapExiosion概述
SoapExtension和So Attribute兩個類別用於控制webservice序列化和反序列化的一般過程,可對webservice進行壓縮和日誌等功能進行控制.
2.實現代碼
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; namespace XMLClass1.class15.content { [AttributeUsage(AttributeTargets.Method)] public class MyExtensionAttribute : SoapExtensionAttribute { int _priority = 1; public override int Priority { get { return _priority; } set { _priority = value; } } public override Type ExtensionType { get { return typeof(MyExtension); } } } public class MyExtension : SoapExtension { //这个override的方法会被调用四次 //分别是SoapMessageStage BeforeSerialize,AfterSerialize,BeforeDeserialize,AfterDeserialize public override void ProcessMessage(SoapMessage message) { if (message.Stage == SoapMessageStage.AfterDeserialize)//反序列化之后处理 { bool check = false; foreach (SoapHeader header in message.Headers) { if (header is MySoapHeader) { MySoapHeader myHeader = (MySoapHeader)header; if (myHeader.Name == "admin" || myHeader.PassWord == "admin") { check = true; break; } } } if (!check) throw new SoapHeaderException("认证失败", SoapException.ClientFaultCode); } } public override Object GetInitializer(Type type) { return GetType(); } public override Object GetInitializer(LogicalMethodInfo info, SoapExtensionAttribute attribute) { return null; } public override void Initialize(Object initializer) { } } public class MySoapHeader : SoapHeader { string _name; string _passWord; public string Name { get { return _name; } set { _name = value; } } public string PassWord { get { return _passWord; } set { _passWord = value; } } } /// <summary> /// headersoap2 的摘要说明 /// </summary> [WebService(Namespace = http://tempuri.org/)] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。 // [System.Web.Script.Services.ScriptService] public class headersoap2 : System.Web.Services.WebService { public MySoapHeader header; [WebMethod] [MyExtensionAttribute] [SoapHeader("header", Direction = SoapHeaderDirection.In)] public string CheckHeader() { //业务逻辑. return "Something done"; } } }
以上就是Webservice的安全設定全部內容,希望能給大家一個參考,也希望大家多多支援PHP中文網。
更多ASP.NET中Webservice安全 實現存取權限控制相關文章請關注PHP中文網!