[c#]如何編寫需要授權才能使用的WebService?[轉]

接觸WebService沒多久,一個令我困擾的問題就是怎麼樣給自己開發的WebService加上身份認證的功能,因爲我不想什麼亂七八糟的人使用我的服務,因爲這個WebService可能存在一些有關個人隱私的信息,除了授權的人之外,閒雜人等一律要拒之門外。這個對於Windows應用程序來說易如反掌的功能在WebService上應該如何實現呢?
  具體如何實現者一功能有許多方法,在CodeGuru的
Build Secure Web Services With SOAP Headers and Extensions文章中使用了一種不錯的方法,可以大體上解決我的問題,但是在Quotes2實現裏每次都需要驗證一次用戶名和密碼,而Quote3實現的方法假如使用HTTP GET和HTTP POST好像又會失效,總是感覺美中不足,有沒有一種方法可以對WebService的任何調用方式都有效呢?經過多方查找資料,終於找到一個可行的方法:利用Session。假如你編寫過Web應用程序的話,對於Session肯定不陌生,對於需要保持狀態的程序而言,Session和Application是必不可少的,比如那些論壇和留言版等等。我們這裏就要利用相同的機制實現用戶認證。
  首先我給WebService添加一個名爲Login的方法:

[WebMethod (EnableSession = true)]
public string Login(string userName, string password)
{
    
if (userName == "username" && password == "password")
    
{
        Session[
"login"= 1;
        
return "welcome";
    }

    
else
        
return "login failed";
}

  這裏僅僅是一個示例,因此我簡化了用戶的認證過程,Login方法很簡單,它所作的工作就是在用戶身份驗證通過之後將Session["login"]置爲1表示用戶通過驗證,否則返回"login failed"的錯誤信息。這裏的實現和一般的WebMethod沒有什麼區別,除了多了一個屬性EnableSession = true之外。這是我們實現認證功能的關鍵所在,在這個WebService中,所有的方法都必須使用這個屬性加以標記。
  好了,服務器端的工作就查不多了(這麼簡單,不可思議吧),爲了檢驗我們這個方法是否有效,我們再添加一個方法驗證一下:
[WebMethod (EnableSession = true)]
public string GetStatus()
{
    
if (Convert.ToInt32(Session["login"]) == 1)
        
return "Thank you.";
    
else
        
return "Please Login first.";
}


  現在我們來編寫一個客戶端驗證一下到底這個方法是否有效,新建一個控制檯程序TestCon,添加這個程序的Web引用,並把引用文件夾重命名爲login,編寫如下代碼:
using System;
using System.Data;
using System.Data.SqlClient;
using TestCon.login;

class MainEntryPoint
{
    
static void Main(string[] args)
    
{
        LoginService ls 
= new LoginService();
        Console.WriteLine(ls.Login(
"username""password"));
        Console.ReadLine();
        Console.WriteLine(ls.GetStatus());
    }

}
  Ctrl+F5運行程序,程序運行結果如下:

  呵呵,結果好像不對,用戶名和密碼都沒錯,調用GetStatus爲什麼失敗了呢?想想這這結果是理所當然的,Session保存數據是靠cookie實現的,我們這個是一個普通的控制檯程序,它又沒什麼地方存放cookie信息,自然不能正確使用了。假如用一個asp程序測試的話,認證功能已經實現,不信你試一下!
  但是我們要在普通的應用程序中實現用戶認證,難道就沒有辦法了麼,當然有了,既然程序沒地方存放cookie,那我們給它一個不就完了嘛,好,我們改寫程序如下:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Net;
using TestCon.login;

class MainEntryPoint
{
    
static void Main(string[] args)
    
{
        LoginService ls 
= new LoginService();
        CookieContainer cc 
= new CookieContainer();
        ls.CookieContainer 
= cc;
        Console.WriteLine(ls.Login(
"username""password"));
        Console.ReadLine();
        Console.WriteLine(ls.GetStatus());
    }

}
  再Ctrl+F5,變:

  哈,這下對了吧,功夫不負有心人,這下你想用我的WebService就沒那麼容易了吧,搞定,呵呵!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章