.NET裡的表單驗證:使用資料庫

來源:互聯網
上載者:User

我們上次討論過,使用ASP.NET裡表單驗證最簡單的方法是把所有的資訊都儲存在Web.config檔案裡,包括使用者名稱和密碼。這是讓基本的驗證在你網站上迅速起作用和啟動並執行好方法,但是它還是有很大的局限性。尤其是:

·你無法使用註冊表單讓新使用者添加他們自己,因為在網站啟動並執行時候,你不能編輯應用程式的代碼,也不能重新儲存Web.config檔案。
·通過手動編輯Web.config檔案來添加使用者是很辛苦的,它還需要你的Web應用程式重啟,這會影響到已有的訪問者。
·使用者不能定期更改自己的密碼。

要突破這些局限,我們就應該停止使用Web.config作為儲存使用者資訊的地方,並把這些資訊轉移到資料庫裡。在使用者填好登入表單之後,我們就可以通過修改驗證代碼來查詢這個資料庫了。下面就是我們要做的,簡而言之就是:

1、更改Web.config,把直接儲存在裡面的使用者信任書移走。
2、更改我們登入按鈕的代碼,這樣它就能夠調用另一個函數,從而將使用者資訊和資料庫裡的資訊進行對比驗證。
3、編寫一個validateUser方法,負責辨別使用者是否存在以及他或者她是否提供了正確密碼的大部分工作都由它完成。
4、編寫一個addUser方法,用來把新使用者放到資料庫裡。

為了保持連貫性,我們基本上會使用前一篇文章裡用過的代碼清單,只是要在所需要的地方進行修改。但是這不意味著你就一定需要讀前面的文章,你可以就從本文開始。

Web.config

Web.config是一個設定檔,所有ASP.NET的應用程式一般都會把這個檔案放在其根目錄下,它包含有<authentication>和<authorization>這兩個區段。<authentication>區段裡包含了ASP.NET如何辨別訪問者誰是誰的細節,而<authorization>區段會指出哪個通過驗證的使用者能夠訪問目錄下的.aspx檔案。

Listing A裡的Web.config檔案和我們上次用到的是一樣的,只有一個很大的不同之處(我們馬上就會講到這一點)。<authentication>元素會指出ASP.NET應該使用驗證的Forms方法,這和所整合的Windows驗證以及微軟的Passport驗證是相對的。<forms>元素會接著給出更多的細節,用來確定ASP.NET應該使用表單認證,並指出登入頁面放在哪裡。在前一篇文章裡,我們還使用了<credentials>元素,所以我們能夠把使用者名稱和密碼就儲存在Web.config檔案裡。這一次,我們把<credentials>區段留在那裡作為參考,但是把它包括在XML注釋標籤裡,所以它就不會被ASP.NET使用。這就是那個很大的不同。

最後,帶有<deny users="?"/>子項目的<authorization>元素會指出,匿名使用者不被允許看到.aspx頁面。每個人都會被強制進行驗證,這就意味著在每次會話中,它們至少會被送到登入頁面一次。
 
登入按鈕

Listing B包含了一個用於登入表單按鈕的點擊事件控制代碼。再強調一次,我們在上一次就把所有的代碼都放在這個列表裡了,只不過我們上次在不需要的代碼前面標上了注釋符,並清楚地表示過我們這次要加入哪些代碼。

如列表所示,我們不再是簡單地讓點擊事件調用FormsAuthentication類的Authenticate方法。這個方法會搜尋Web.config檔案裡的使用者名稱和密碼,並把它們同傳遞來的參數進行對比。但是由於我們使用了資料庫來儲存使用者名稱和密碼,所以我們會編寫自己的方法——validateUser,我們下面就會講到它。這個按鈕的點擊事件會調用我們的validateUser方法,並把使用者在Web表單文字欄位裡提供的使用者名稱和密碼傳遞給它。如果驗證成功,那麼RedirectFromLoginPage就會被調用,這樣使用者就會被重新引導到他或者她在被提示登入之前想要訪問的頁面上。

ValidateUser方法

Listing C包含了validateUser方法,它具有下面這些功能:

·它能夠接受使用者名稱和密碼作為字串參數。
·它使用.NET所提供的簡單方法對密碼進行散列(hash)操作,因為資料庫裡的密碼也經過了散列
  處理,這樣密碼就不會以明文出現。
·它能夠串連到資料庫,並運行一個查詢,用來在含有使用者名稱和密碼的表格裡尋找使用者名稱。
·如果它找到了使用者名稱,它就會將儲存在資料庫裡的密碼同作為方法參數的經過散列的密碼進行比
  較。

列表裡的資料庫代碼是相當簡單的。因為這不是一篇關於.NET資料訪問的文章,所以我們不用深入細節。但是,在資料庫代碼之前對密碼的散列操作是需要特別注意地。

如果你正準備把使用者名稱和密碼儲存到資料庫裡,那就要考慮變換密碼,這樣它就不會以明文出現資料庫的欄位裡,明文很容易被盜。.NET提供了一個很簡單的方法把密碼變換成一串毫無疑義的字串。這個方法是HashPasswordForStoringInConfigFile,它也是FormsAuthentication類的一部分。不要讓這個方法長名字的“ConfigFile”部分給嚇住;這個方法只會對傳遞給它的文本進行變換,然後你就可以把結果放在你想放的任何地方。

下面是散列方法能幹什麼的一個例子。如果你提供這段C#代碼:

string hashed =
FormsAuthentication.HashPasswordForStoringInConfigFile(
“password”,”SHA1”);

那麼經過散列變換就會變成下面的字串:
5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8

對密碼進行散列操作的不足之處是,(就我的知識能力而言)沒有辦法協助忘記密碼的使用者找回密碼。換句話說,你不能反散列它找回明文。但是,你可以為這樣的使用者指派一個新的臨時密碼,然後他或者她就可以先登入再更改密碼,只要你的網站支援這個功能的話。

添加使用者

我們現在可以討論用來向你的網站添加使用者的代碼了。由於直接在Web.config裡儲存使用者名稱和密碼的限制,我們不能在上一篇文章裡討論這個問題。既然已經轉到使用資料庫上了,那我們可以編寫一個簡單的addUser方法來接受使用者名稱和密碼,並散列密碼,再把新的行插入到資料庫表格裡。Listing D是這樣一個方法的例子。

正如你所看到的,這段代碼和validateUser方法的代碼很類似:使用者名稱和純文字密碼被傳遞進來,密碼被散列,這個被散列的密碼會被用在資料庫代碼裡。它們之間巨大的不同是:資料庫代碼用到了SQL的INSERT而不是SELECT,這就意味著它不需要DataReader類對象。

我們通過提交註冊表單裡的點擊事件來調用addUser方法,例如圖A裡的簡單表單。

改進的餘地

我們的列表只是拋磚引玉,你應該考慮一些可能想要增加的東西。例如,如果validateUser失敗了,那麼登入按鈕的點擊事件控制代碼應該做些什麼呢?我們的簡單例子向頁面上的控制項添加了一條失敗資訊。但是如果使用者一遍又一遍的嘗試和失敗,那又該怎麼辦呢?這個人是一個嘗試猜測密碼的未授權使用者嗎?你應該追蹤validateUser的這些失敗並在嘗試失敗幾次後就鎖定這個帳號嗎?

而且要考慮一下,如果addUser所要試圖添加的使用者名稱在資料庫裡已經存在,那麼這個方法應該怎麼辦。我們的範例程式碼不會考慮這種可能性,但是你用於實際工作的代碼就要考慮了。

最後,雖然我們在本文裡介紹了安全上的改進,但是要理解所存在的危險是很重要的。我們已經對密碼進行了散列操作,並將它們儲存在資料庫而不是明文的設定檔裡,這是走向安全的第一步。但是要記住的是,我們所有的散列操作都發生在ASP.NET的伺服器代碼裡,而密碼是從使用者的瀏覽器穿過電纜到達伺服器的,這一點非常重要。除非瀏覽器到你伺服器的串連是通過安全通訊端(SSL)進行的,否則通過電纜傳送的密碼就會是明文。如果使用者密碼的安全是首要的,那麼你就應該要求到你網站的都是SSL串連。

事倍功半

和前一篇文章裡基於Web.config的解決方案相比,通過把使用者資訊儲存在資料庫裡,我們又向自己網站的認證系統裡添加了相當多的功能。我們新的方法肯定需要更多的代碼,但是這都不是很難的代碼。在儲存密碼之前對密碼進行散列操作的額外安全步驟只需要調用一個方法,所添加的其他代碼大都是用於對資料庫的標準訪問的——這一內容對於我們很多人來說已經很熟悉了。但是努力的付出增加了功能,這樣的效費比是很高的。你要採取的下一步驟是:把使用者資訊從Web.config裡弄出來!

 



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。