詳解ASP.NET七大身份驗(yàn)證方式以及解決方案
在B/S系統(tǒng)開(kāi)發(fā)中,經(jīng)常需要使用“身份驗(yàn)證”。因?yàn)閣eb應(yīng)用程序非常特殊,和傳統(tǒng)的C/S程序不同,默認(rèn)情況下(不采用任何身份驗(yàn)證方式和權(quán)限控制手段),當(dāng)你的程序在互聯(lián)網(wǎng)/局域網(wǎng)上公開(kāi)后,任何人都能夠訪問(wèn)你的web應(yīng)用程序的資源,這樣很難保障應(yīng)用程序安全性。通俗點(diǎn)來(lái)說(shuō):對(duì)于大多數(shù)的內(nèi)部系統(tǒng)、業(yè)務(wù)支撐平臺(tái)等而言,用戶必須登錄,否則無(wú)法訪問(wèn)和操作任何頁(yè)面。而對(duì)于互聯(lián)網(wǎng)(網(wǎng)站)而言,又有些差異,因?yàn)橥ǔ>W(wǎng)站的大部分頁(yè)面和信息都是對(duì)外公開(kāi)的,只有涉及到注冊(cè)用戶個(gè)人信息的操作,或者網(wǎng)站的后臺(tái)管理等才需要提示登錄。(如果不做嚴(yán)格驗(yàn)證,后果將很?chē)?yán)重,人家一旦猜出你web目錄下面的頁(yè)面名,可以隨意訪問(wèn)。當(dāng)然,一般的開(kāi)發(fā)人員是不會(huì)犯這種低智商的錯(cuò)誤的)。
如何實(shí)現(xiàn)“身份驗(yàn)證”
記得N年前我最早接觸Servlet + JSP開(kāi)發(fā)的時(shí)候,有一種叫做“過(guò)濾器”(Filter)的東西,真是很神奇。有了這件神奇的東西后,我再也不需要去每個(gè)頁(yè)面判斷什么“session”或者“cookie”了,就能把未登錄用戶給彈出去(水平實(shí)現(xiàn)有限)。當(dāng)然,在傳統(tǒng)webform開(kāi)發(fā)中,也可以寫(xiě)一個(gè)“BasePage的雞肋”,在該類(lèi)中去做判斷,讓每個(gè)頁(yè)面對(duì)應(yīng)的類(lèi)都去實(shí)現(xiàn)這個(gè)"雞肋",我看以前很多公司都是這么干的。
在asp.net中,其實(shí)微軟提供了一整套的完整的機(jī)制來(lái)實(shí)現(xiàn)“成員角色管理”。包含有:”登錄控件”、“membership”、“個(gè)性化數(shù)據(jù)庫(kù)”等等。但是大多數(shù)開(kāi)發(fā)人員是從來(lái)不用這些的(例如我,用微軟的asp.net三四年,還從來(lái)沒(méi)見(jiàn)過(guò)“登錄控件”長(zhǎng)啥樣)。在asp.net身份驗(yàn)證中,主要有三四種。因?yàn)橛行┥矸蒡?yàn)證的方式是依賴于IIS和windows操作系統(tǒng)的,所以在不同版本的操作系統(tǒng)和IIS上還是有些差異的。由于筆者暫時(shí)使用的是windows 7的操作系統(tǒng),所以就拿IIS 7.5為例子。
首先打開(kāi)IIS,然后雙擊右側(cè)“身份驗(yàn)證”,會(huì)顯示出當(dāng)前IIS支持的所有的身份驗(yàn)證方式(由于我安裝IIS時(shí)候,在“安全性”那里我是全部勾選的)??梢钥吹饺鐖D:
大致分為如下幾種:
1.活動(dòng)目錄的客戶端證書(shū)(這個(gè)很可能是收費(fèi)的),不常用,不細(xì)說(shuō)。
2.ASP.NET模擬(MSDN:如果要在 ASP.NET 應(yīng)用程序的非默認(rèn)安全上下文中運(yùn)行 ASP.NET 應(yīng)用程序,請(qǐng)使用 ASP.NET 模擬。),機(jī)器人說(shuō)的我聽(tīng)不懂。
3.Form身份驗(yàn)證:這個(gè)用的很多,后面會(huì)細(xì)說(shuō)。
4.windows身份驗(yàn)證:基于windows操作系統(tǒng)的用戶或者域用戶的身份驗(yàn)證。
5.基本身份驗(yàn)證:其實(shí)也是基于windows操作系統(tǒng)的賬戶驗(yàn)證的。
6.匿名身份驗(yàn)證:誰(shuí)都可以訪問(wèn),其內(nèi)部也是通過(guò)指定一個(gè)特定的windows系統(tǒng)的user賬戶來(lái)訪問(wèn)的。
7.摘要身份驗(yàn)證:使用 Windows 域控制器對(duì)請(qǐng)求訪問(wèn) Web 服務(wù)器內(nèi)容的用戶進(jìn)行身份驗(yàn)證。
再來(lái)看看經(jīng)典的 IIS 6的截圖:
注:.NET Passport 可以理解為微軟對(duì)“單點(diǎn)登錄”的一種實(shí)現(xiàn)方案,這里不細(xì)說(shuō)。
先在IIS 7上測(cè)試一下基本身份驗(yàn)證:
首先把其他的身份驗(yàn)證方式全部禁用掉,然后僅僅啟用“基本身份驗(yàn)證”。有圖有真相:
然后打開(kāi)IE、FireFox、chrome等瀏覽器,敲入localhost,等待打開(kāi)IIS上的默認(rèn)網(wǎng)站。你會(huì)發(fā)現(xiàn),瀏覽器端都會(huì)彈出提示框信息,而且在不同瀏覽器上彈出框的樣式和表現(xiàn)形式也有所差異。(長(zhǎng)期不用IE,發(fā)現(xiàn)360這個(gè)老流氓把哥的首頁(yè)給改了,還號(hào)稱”安全上網(wǎng)“,這明顯是篡改行為嘛。搞不懂。)
FireFox中:
如果你在彈出框中,輸入正確的windows賬戶和密碼,則可以正常的瀏覽你請(qǐng)求的網(wǎng)頁(yè)。如果你不輸或者輸錯(cuò)了,等待你的將是401錯(cuò)誤(401,你懂得)。
“沒(méi)有為網(wǎng)站啟用SSL,將通過(guò)電纜以明文的方式.....”,機(jī)器人說(shuō)的話聽(tīng)起來(lái)很別扭,這里,我解釋一下。
當(dāng)你沒(méi)有花錢(qián)去買(mǎi)SSL證書(shū)(安全套接層,你可以簡(jiǎn)單的理解為:正常http請(qǐng)求都是明文傳送,使用SSL后可以幫你把http報(bào)文自動(dòng)加密,就算有人在互聯(lián)網(wǎng)上截獲了也無(wú)法解密。我們偶爾訪問(wèn)有些網(wǎng)站的時(shí)候,看到的“https://www.xxx.com”,就極可能是基于SSL證書(shū)的形式)。至于“通過(guò)電纜以明文的方式...”,其實(shí)這句話說(shuō)的很不對(duì),首先,電纜只是一種傳輸介質(zhì),里面?zhèn)魉偷闹皇请娒}沖、光信號(hào)等等,而不是網(wǎng)絡(luò)協(xié)議報(bào)文(學(xué)過(guò)計(jì)算機(jī)網(wǎng)絡(luò)的都知道)。至于說(shuō)“采用明文的形式”,也不對(duì),其實(shí)“基本身份驗(yàn)證”中,是將用戶名和密碼采用了Base64編碼的,感興趣的讀者,可以用httpwatch或者Fiddler之類(lèi)的工具去監(jiān)視一下http請(qǐng)求,我這里就不做演示了 。只是由于Base 64編碼很容易反編碼,所以和明文沒(méi)啥區(qū)別。這樣一來(lái),你會(huì)發(fā)現(xiàn)“基本身份驗(yàn)證”方式,確實(shí)存在很多不安全因素。
在IIS 7上測(cè)試一下windows 身份驗(yàn)證:
和之前的基本身份驗(yàn)證差不多,我就不再截圖演示了。如果用戶輸入正確的windows用戶名和密碼,則能夠正常訪問(wèn)網(wǎng)站。如果輸入錯(cuò)誤的,則返回的401.1(前面基本身份驗(yàn)證是401.2)。值得一提的就是,記得之前有位asp.net MVP 曾告訴過(guò)我,使用windows身份驗(yàn)證的時(shí)候,只能用戶在使用IE瀏覽器時(shí)候才能夠正常訪問(wèn)。因?yàn)檫@種情況下,不是使用http報(bào)文傳輸?shù)男问?,而是瀏覽器端直接與操作系統(tǒng)內(nèi)部交互,進(jìn)行用戶名和密碼的驗(yàn)證。經(jīng)過(guò)證實(shí),發(fā)現(xiàn)這話的后半句是對(duì)的,確實(shí)監(jiān)視不到http實(shí)體內(nèi)容。但不僅僅局限于IE瀏覽器,我在firefox中也能夠正常的訪問(wèn)和使用。
匿名身份驗(yàn)證:
所謂匿名身份驗(yàn)證,其實(shí)就可以理解為“不驗(yàn)證”。就是匿名用戶都可以訪問(wèn)資源,沒(méi)有任何限制。通常我們的網(wǎng)站,都要啟用匿名方式驗(yàn)證,集成windows身份驗(yàn)證。不難發(fā)現(xiàn),其實(shí)匿名身份驗(yàn)證,也是通過(guò)windows用戶組里面的一個(gè)特定的用戶來(lái)通過(guò)驗(yàn)證的,如圖所示:
最后一種,Form身份驗(yàn)證:
前面所講的那些身份驗(yàn)證方式,其實(shí)都和asp.net沒(méi)有直接的聯(lián)系,都是IIS 和操作系統(tǒng)級(jí)別的驗(yàn)證方式。而Form 身份驗(yàn)證,則需要asp.net提供支持。因?yàn)橥ǔ>W(wǎng)站的身份驗(yàn)證和成員管理都非常復(fù)雜,而不是通過(guò)單純的某一種驗(yàn)證方式能夠?qū)崿F(xiàn)的。對(duì)于大部分互聯(lián)網(wǎng)的網(wǎng)站而言,用戶可以訪問(wèn)部分頁(yè)面,但部分頁(yè)面必須登錄后才能訪問(wèn)和操作,而且不同用戶角色登錄,操作權(quán)限也不一樣。這又會(huì)涉及到很多方面的知識(shí),而且實(shí)現(xiàn)方式也有很多種。
由于篇幅和時(shí)間有限,今天就先到此。后期我再詳細(xì)地去整理關(guān)于Form身份驗(yàn)證的詳細(xì)及成員管理,權(quán)限管理方面的文章,敬請(qǐng)期待。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。
- asp.net 身份驗(yàn)證(分目錄驗(yàn)證篇)
- asp.net Forms身份驗(yàn)證和基于角色的權(quán)限訪問(wèn)
- asp.net forms身份驗(yàn)證,避免重復(fù)造輪子
- ASP.NET Internet安全Forms身份驗(yàn)證方法
- Asp.Net二級(jí)域名共享Forms身份驗(yàn)證、下載站/圖片站的授權(quán)訪問(wèn)控制
- asp.net身份驗(yàn)證方式介紹
- asp.net 身份驗(yàn)證機(jī)制實(shí)例代碼
- Asp.net Mvc 身份驗(yàn)證、異常處理、權(quán)限驗(yàn)證(攔截器)實(shí)現(xiàn)代碼
- asp.net中幾種常用的身份驗(yàn)證方法總結(jié)
- ASP.NET窗體身份驗(yàn)證詳解
相關(guān)文章
asp.net中在用ajax格式傳遞數(shù)據(jù)到aspx頁(yè)面時(shí)出現(xiàn)亂碼
asp.net中在用ajax格式傳遞數(shù)據(jù)到aspx頁(yè)面時(shí)有時(shí)會(huì)出現(xiàn)亂碼,很是疑惑,不要走開(kāi)接下來(lái)介紹解決方法,感興趣的朋友可以了解下2013-01-01.net面向?qū)ο笾嗑€程(Multithreading)及 多線程高級(jí)應(yīng)用
這篇文章主要介紹.net面向?qū)ο蟪绦蛟O(shè)計(jì)階段多線程Multithreading及多線程高級(jí)應(yīng)用的介紹,需要的朋友可以參考下2015-07-07SqlCommandBuilder類(lèi)批量更新excel或者CSV數(shù)據(jù)的方法
這篇文章主要介紹了SqlCommandBuilder類(lèi)批量更新excel或者CSV數(shù)據(jù)的方法,需要的朋友可以參考下2015-10-10.net中的session與cookies區(qū)別及使用方法
cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上,cookie不是很安全,別人可以分析存放在本地的COOKIE并進(jìn)行COOKIE欺騙,考慮到安全應(yīng)當(dāng)使用session2013-04-04ASP.NET中使用開(kāi)源組件NPOI快速導(dǎo)入導(dǎo)出Execl數(shù)據(jù)
這篇文章主要介紹了ASP.NET中使用開(kāi)源組件NPOI快速導(dǎo)入導(dǎo)出Execl數(shù)據(jù),NPOI是一個(gè)很強(qiáng)大的Execl操作組件,需要的朋友可以參考下2014-09-09.NET使用Hisql實(shí)現(xiàn)菜單管理(增刪改查)
這篇文章介紹了.NET使用Hisql實(shí)現(xiàn)菜單管理(增刪改查)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07關(guān)于有些Asp.net項(xiàng)目發(fā)布后出現(xiàn)網(wǎng)址亂碼的解決方法
最近在部署一個(gè)網(wǎng)站,net2.0開(kāi)發(fā)的,但是遇到一個(gè)很奇怪的問(wèn)題。2011-07-07Ajax異步無(wú)刷新對(duì)局部數(shù)據(jù)更新
Ajax異步無(wú)刷新對(duì)局部數(shù)據(jù)更新的實(shí)例2013-03-03