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

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

編輯:關於ASP.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,就這麼簡單!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved