程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 使用ASP.Net Forms模式實現WebService身份驗證

使用ASP.Net Forms模式實現WebService身份驗證

編輯:.NET實例教程
在安全性要求不是很高的ASP.Net程序中,基於Forms的身份驗證是經常使用的一種方式,而如果需要對WebService進行身份驗證,最常用的可能是基於Soap 標頭的自定義身份驗證方式。如果對兩者做一下比較的話,顯然,基於Forms的驗證方式更加方便易用,能否將Forms驗證方式應用到WebService中去呢?
   從理論上講,使用基於Forms的方式對WebService進行身份驗證是可行的,但是使用過程中會存在以下兩個問題:
  1.基於Forms的驗證方式同時也是基於CookIE的驗證方式,在使用浏覽器時,這個問題是不需要我們考慮的。但對於使用WebService的應用程序來說,默認是不能保存CookIE的,需要我們自己去做這個工作。
  2.WebService既然是一個A2A(Application To Application)應用程序,使用Web表單進行身份驗證顯然不太合適,而且,這將不可避免的造成人機交互,使WebService的應用大打折扣。
   接下來,我們就分步解決這兩個問題:
  1.CookIE的保存問題
   WebService的客戶端代理類有一個屬性CookieContainer可用於設置或獲取Cookie集合,保存CookIE的任務就交給他了:
  
  System.Net.CookieContainer cookIEContainer = new System.Net.CookIEContainer();
  
  MyService.WebService service = new App.MyService.WebService();
  service.CookieContainer = cookIEContainer;
  2.我們不想使用Web表單進行身份驗證,幸運的是,ASP.Net表單驗證中的表單頁(即Web.config文件中 forms 元素內的loginUrl)同樣可以指定為WebService文件。
   我們創建一個專門用作身份驗證的Web服務,暫且命名為Login.asmx,然後讓 loginUrl 等於 “Login.asmx”,當然,還需要在Web.config文件中的 authorization 節中禁止匿名訪問(否則我們可就白忙活了),完成配置後的Web.config文件如下:
  
  <?XML version="1.0" encoding="utf-8"?>
  <configuration>
   <system.web>
   <compilation debug="false" />
   <authentication mode="Forms">
   <forms name="MyService" loginUrl="Login.asmx"></forms>
   </authentication>
   <authorization >
   <deny users="?"/>
   </authorization>
   </system.web>
  </configuration>
  
   其實我們並不想在未通過身份驗證時讓浏覽器轉向到Login.asmx,對於使用WebService的客戶程序來說,真正的實惠在於:可以匿名訪問Login.asmx中的方法(當然我們也可以把Login.asmx放在單獨的目錄中,然後允許對該目錄的匿名訪問來達個這個目的,但我覺得還是用loginUrl更優雅一些)。
   接下來,我們為Login.asmx添加用於身份驗證的WebMethod:
  
  [WebMethod]
  public bool Check(string userName,string passWord)
  {
   if (userName == "aaaaaa" && passWord == "123456")//添加驗證邏輯
   { System.Web.Security.FormsAuthentication.SetAuthCookIE(userName, false);
   return true;
   }
   else
   {
   return false;
   }
  }
   最後一步工作就是:讓客戶程序中的WebService實例與Login實例共享CookIEContainer。
  
  class Sample
  {
   System.Net.CookieContainer cookIEContainer = new System.Net.CookIEContainer();
  
   public void Login()
   {
   MyServiceLogin.Login login = new App.MyServiceLogin.Login();
   login.CookieContainer = cookIEContainer;
   login.Check("aaaaaa", "123456");
   }
  
   public void ShowHelloWorld()
   {
   MyService.WebService service = new App.MyService.WebService();
   service.CookieContainer = cookIEContainer;
  
   Console.WriteLine(service.HelloWorld());
   }
  }
   Login()以後再ShowHelloWorld(),你是否看到了我們熟悉的“Hello World”?Ok,就這麼簡單!
  http://www.cnblogs.com/chinadhf/archive/2006/10/08/520975.Html 
  
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved