IssueVision與TaskVision 使用技術比較

iDotNetSpace發表於2008-01-22

[轉]

本菜鳥目前對microsoft smartclient技術非常感興趣,最近仔細分析了microsoft編寫的issuevision和taskvision 這兩個smartclient demo,個人感覺上才開始接觸smartclient的朋友最好先分析taskvision,在有一定的基礎上在分析issuevision。這樣學習效果可能比較好。為了讓才開始接觸smartclinet的朋友少走些彎路,同時也為了與學習microsoft smartclient技術的朋友更好的進行技術交流,本菜鳥將把這幾個星期issuesvision和taskvision的學習心得與各位同行進行分享。

  當客戶端呼叫xml web services時,為了安全因素,通常會要求客戶端進行身份驗證,只有通過身份驗證才有許可權呼叫xml web services 提供的方法。issuevision使用soapheader傳遞xml web services 自定義身份驗證資料。taskvision使用formsauthenticationticket的 forms 身份驗證 cookie(包含身份驗票)來獲取呼叫xml web services方法的許可權。下面將對這兩種xml web services自定義身份驗證資料的方法進行詳細的講解。

 

  soapheader傳遞xml web services 自定義身份驗證資料

soap 標頭提供了一種方法,用於將資料傳遞到 xml web services 方法或從xml web services 方法傳遞資料,條件是該資料不直接與xml web services 方法的主功能相關。例如,一個xml web servicess 可能包含若干個xml web services 方法,而每個方法都需要自定義的身份驗證方案。您不用將引數新增到每個需要自定義身份驗證方案的xml web services 方法,而可以將引用從soapheader派生的類的 soapheaderattribute 應用於每個xml web services 方法。從soapheader派生的類的實現處理該自定義身份驗證方案。按照此方式, xml web services 方法使用 soap 標頭來僅實現特定於它的功能並新增其他功能。 issuevision 就是利用soapheader的這種能力來實現xml web services自定義身份驗證資料傳遞。

issuevision如何利用soapheader傳遞資料進行webservice自定義身份驗證資料:

  1:建立從soapheader派生的類,表示傳入 soap 標頭的資料。

[issuevision解決方案中issuevisionwebcs專案的credentialsoapheader類實現]

 

   using system.web.services.protocols;

   namespace issuevision.web
   {
      public class credentialsoapheader : soapheader
      {
       private string m_username;
       private string m_password;

          public string username
       {
       get{ return m_username;}

         set{ m_username = value;}
         }

         public string password
         {
        get{ return m_password;}
       set{ m_password = value;}
        }
        }
      }

  2: 將credentialsoapheader類一個成員新增到實現xml web servicess 的類或 xml web servicess 客戶端代理類。

      [issuevision解決方案中issuevisionwebcs專案的issuevisionservices類實現]

 

     namespace issuevision.web
   {
      public class issuevisionservices : web service
      {
         private credentialsoapheader m_credentials
     public credentialsoapheader credentials
     {
       get{ return m_credentials;}
       set{ m_credentials = value;}
     }

   … …
      }
   }

 

  3:將 soapheaderattribute 應用於 xml web services 方法或代理類中的對應方法

    [issuevision解決方案中issuevisionwebcs專案的issuevisionservices類實現]

 

   namespace issuevision.web
   {
     public class issuevisionservices : web service
      {
     … …

      [webmethod(description="returns the lookup tables for issuevision.")]

      [soapheader(“credentials”)]

      public ivdataset getlookuptables()

      {

      securityhelper.verifycredentials(this);

      return new ivdata().getlookuptables();

    }
      }
   }

 

  4:在客戶端程式碼中呼叫xml web services方法前,要求在代理類中設定soap標頭。

  [issuevision解決方案中issuevision專案的webserviceslayer類呼叫xml web services方法並在代理類中設定soap標頭]

 

   namespace issuevision.web
   {
     private static issuevisionservices getwebservicereference(string username, string password)

     {

     issuevisionservices dataservice = new issuevisionservices();

     //

     credentialsoapheader header = new credentialsoapheader();

     header.username = username;

     header.password = password;

     dataservice.credentialsoapheadervalue = header;

     //

  

     initwebserviceproxy(dataservice);

  

     return dataservice;

  }

 

     public static ivdataset getlookuptables()

     {

     ivdataset data = null;

     issuevisionservices dataservice = getwebservicereference();

  

     try

     {

      data = dataservice.getlookuptables();

    }

    … …

     }
   }

 

 

 

 

  formsauthenticationticket的 forms 身份驗證傳遞xml web services 自定義身份驗證資料

  formsauthenticationticket類提供一種建立 formsauthenticationmodule 使用的 forms 身份驗證 cookie(包含身份驗票)並讀取其值的方法。taskvision就是利用formsauthenticationticket來實現xml web services自定義身份驗證資料傳遞。

taskvision如何利用formauthenticationticket傳遞資料進行webservice自定義身份驗證資料:

1:在 xml web services端將客戶端傳入引數進行驗證,驗證通過,則新增新的cache物件,並把驗證的返回值加密儲存在cache中。

[taskvision解決方案中taskvisionwscsvs專案的authservice類實現]

 

  [webmethod()]

  public string getauthorizationticket(string username, string password)

  {

   // try to authenticate the user

   string userid;

   try

   {

   userid = sqlhelper.executescalar(dbconn, "authenticateuser", username, password).tostring();

   }

    finally

   {

   dbconn.close();

   }

   if (userid == null)

   {

   // the user name and password combination is not valid.

   return null;

   }

   // create the ticket

   formsauthenticationticket ticket = new formsauthenticationticket(userid, false, 1);

   string encryptedticket = formsauthentication.encrypt(ticket);

   // get the ticket timeout in minutes

   appsettingsreader configurationappsettings = new appsettingsreader();

   int timeout = (int) configurationappsettings.getvalue("authenticationticket.timeout", typeof(int));

   // cache the ticket

   context.cache.insert(encryptedticket, userid, null, datetime.now.addminutes(timeout), timespan.zero);

   return encryptedticket;

  }

 

  2:將驗證值應用於 xml web services 方法或代理類中的對應方法

[taskvision解決方案中taskvisionwscsvs專案的authservice類實現]

 

    private bool isticketvalid(string ticket, bool isadmincall)

   {

   if (ticket == null || context.cache[ticket] == null)

   {

    return false;

   }

   else

   {

    int userid = int.parse(formsauthentication.decrypt(ticket).name);

    … …

   }     

   }

 

    [webmethod()]

   public userinformation updateuser(string ticket, userinformation userinfo)

   {

if (!isticketvalid(ticket, true))
return null;

    … …

     }

 

  3:客戶端程式碼中呼叫xml web services方法前,要求在代理類中設定驗證值。

 

   namespace taskvision

   {

      public class datalayer

   { 

      private string m_ticket = null;

      … … 

    public datalayerresult getprojects()

      {

      datasetprojects ds;

      try

       {

       ds = m_wsdata.getprojects(m_ticket);

         … …

    }

      }

      }

    }

 

  以上的就是issuevision與taskvision完成xml web services自定義身份驗證的兩種不同的方法。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-157121/,如需轉載,請註明出處,否則將追究法律責任。

相關文章