在安全性要求不是很高的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,就這么簡單!
新聞熱點
疑難解答
圖片精選