ASP.NET中Webservice安全 實現(xiàn)訪問權限控制

字號:


    本文主要講解ASP.NET中的Webservice的安全設置兩種方法,一種基于soapheader,一種基于SoapExtensionAttribute,需要的朋友可以參考下。
    一、 概述:
    Web Services是由企業(yè)發(fā)布的完成其特定商務需求的在線應用服務,其他公司或應用軟件能夠通過Internet來訪問并使用這項在線服務。它邏輯性的為 其他應用程序提供數(shù)據與服務.各應用程序通過網絡協(xié)議和規(guī)定的一些標準數(shù)據格式(Http,XML,Soap)來訪問Web Service,通過Web Service內部執(zhí)行得到所需結果。由于它通過internet進行調用,必然存在網絡用戶都可以調用的安全問題。如何實現(xiàn)webservice的訪問 權限限制,是使用webservice用戶使用面臨重要的問題,下文就給兩種方案,從淺到深解決上面問題。
    二、基于“soapheader” 特性的簡單方法
    1." soapheader" 概述  
    SOAP 標頭提供了一種方法,用于將數(shù)據傳遞到 XML Web services 方法或從 XML Web services 方法傳遞數(shù)據,條件是該數(shù)據不直接與 XML Web services 方法的主功能相關。 多數(shù)情況下用來傳遞用戶身份驗證信息,當然它的作用遠不止如此,有待于在實際應用中發(fā)掘。
    2.soapheader實現(xiàn)用戶身份驗證代碼
    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與SoapExtension概述
    SoapExtension和SoapExtensio。Attribute兩個類用于控制webservice序列化和反序列化的一般過程,可對webservice進行壓縮和日志等功能進行控制.
    2.實現(xiàn)代碼 
    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()
        {
          //業(yè)務邏輯.
          return "Something done";
        }
      }
    }
    以上就是Webservice的安全設置全部內容,希望能給大家一個參考