asp.net 提供了一些新型的authentication 和 authorization 方案,對于開發(fā)人員來說這將是和以前不同的一種方式??上驳氖莂sp.net提供的方案多樣更加靈活;可惜的是這種方案是基于iis的。我知道,有些人并不喜歡iis,認(rèn)為它容易受攻擊。只是一直不喜歡asp的方式,雜亂的html標(biāo)記中夾雜著代碼,難于維護也難于調(diào)試?,F(xiàn)在有了新的解決方案,讓我們看看。
新型asp.net authentication provider(下面我會用asp.net ap來簡稱)僅僅發(fā)生在調(diào)用asp.net引擎執(zhí)行.aspx文件時發(fā)生,這也意味著當(dāng)調(diào)用.asp文件時將不會調(diào)用asp.net引擎。所有的authentication選項被放在一個xml文件中。每當(dāng)你創(chuàng)建一個asp.net的project時,你可以在project目錄下發(fā)現(xiàn)一個config.web文件,在這個xml文件的<security>, <authentication>, <authorization>等標(biāo)記中你可以進行設(shè)置和控制。默認(rèn)的是:<authentication mode="none" />,這意味著asp.net將不使用任何的authentication provider,那么這種模式下,asp.net的底層實現(xiàn)和原來的asp和iis 4/5 將完全相同。
一個典型的config.web的一般會是下面這樣的:
<!-- authentication
this section sets the authentication policies of the application. possible modes are "windows", "forms", "passport" and "none"
-->
<authentication mode="none" />
我們會逐一的考察<authentication>中各個可能的值,不過作為一個開放人員最后我的重點會放在”forms”上,最后確定一下我們的平臺環(huán)境:w2k adv , vs.net rcx , ie 6 。(vs.net beta2 應(yīng)該也是可以的,因為寫這篇文章時我的系統(tǒng)已從beta 2上升級了,所以只能說:我想beta 2也是可以的。不過我們不會討論mode=”cookie”的情況,這個標(biāo)記只發(fā)生在asp+的情況下,beta 2之后的asp.net中應(yīng)當(dāng)沒有了),然后我們還會使用到sdk中帶的例子,因為簡單所以可以是最好的一個起點。
然后我們需要簡單的設(shè)置一下子,先建立一個目錄c:/inetpub/wwwroot/security,然后copy原來sdk的frameworksdk/samples/quickstart/aspplus/samples/security中的文件到新建的目錄中(也可以直接解壓縮附帶文件到這個目錄中)
1. mode=”none”
這種模式是默認(rèn)的,像上面提到的那樣,它的行為和原來的asp沒有任何的不同。
但你使用vs.net生成一個asp.net 的project時,這種模式是默認(rèn)生成的。
2. mode=”windows”
這種模式下,我們所訪問的每一個頁面都將需要通過系統(tǒng)的authentication,訪問者可能看到有些迷惑和windows環(huán)境下特有的authentication窗口 ,老實說我更喜歡看到 window xp下的,它更可愛一些。使用這種模式意味著你可以不用額外的寫任何代碼,很快的實現(xiàn),但我想你的商業(yè)用戶不會喜歡它,而且作為一個開發(fā)人員,你無法定制它。
現(xiàn)在你實現(xiàn)這種方式將會非常的簡單。
1. 在config.web 文件中設(shè)置<authentication mode="windows" />
2. 去iis的控制管理界面設(shè)置你的application屬性就可以了。如下圖:
3. 然后訪問你的頁面,你會看到這個對話框,很有趣但絕對讓非專業(yè)人士迷惑。
4. 我們使用的是windowauth的頁面。注意mode=” windows”,還沒有先進到只用設(shè)置好mode=就可以實現(xiàn)windows authentication了。
結(jié)果如圖:
3. mode=”passport”
對于這種模式下,asp.net引擎會使用microsoft passport的authentication機制,理論上這種模式將是最ok和省力的,不過照目前看來,想在asp.net下實現(xiàn)passport還不是一件輕松的事情,vs.net beta 2的類庫并沒有完全實現(xiàn)passport 2.1的功能(passportidentity). microsoft目前唯一展示的是在msdn上的coldstorage例子,實現(xiàn)上基本基于passport 1.4而且像使用directx 一樣,還需要專門的一個dll。有資料顯示vs.net rc2之后的類庫已經(jīng)實現(xiàn)了原來未實現(xiàn)的功能,但就目前看來缺少這方面的資料,所以把這方面的信息留給microsoft和passport 3.0吧,以后的時間我們會再來考察,對于passport我深有信心,而且只要在microsoft平臺,我們都可能無法逃避面對passport.
有關(guān)coldstorage的passport的信息,可以參見下面的文章:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncold/html/storageauthentication.asp
4. mode=”forms”
這種模式下,我想每個開放人員將獲得最大的靈活性和控制,而且從現(xiàn)在看來,這是最實用和可行的一種方式。先看一個比較簡單的例子:
1. 在config.web 文件中進行下面的設(shè)置:
<authentication mode="forms">
<forms name=".aspxuserdemo" loginurl="login.aspx" />
</authentication>
loginurl=”string” 表明未通過authentication的請求將被定向到的頁面,你可以自行設(shè)置。
2. 然后點擊或在login.aspx 文件的login按鈕的click的事件處理程序中寫入下面的代碼:
void login_click(object sender, eventargs e) {
// authenticate user: this samples accepts only one user with
// a name of [email protected] and a password of 'ccboy'
if ((useremail.value == "[email protected]") && (userpass.value == "ccboy")) {
formsauthentication.redirectfromloginpage(useremail.value, persistcookie.checked);
}
else {
msg.text = "invalid credentials: please try again";
}
}
這里我們使用的硬編碼,目前只允許[email protected] 和 ccboy作為登錄的用戶。測試時我們并不直接訪問login.aspx而是請求default.aspx這個頁面,asp.net使用其authentication機制,將重新定向到login.aspx,當(dāng)用戶輸入的信息被接受則返回最初請求的default.aspx.方式上由于我們使用dotnet的webui控件,更加對象化了,當(dāng)判斷通過formsauthentication 執(zhí)行redirectfromloginpage 方法,這個函數(shù)發(fā)出cookie,并把用戶重新定向到最初請求的資源。這種方式下asp.net ap做了一半的工作,事實上它是被動的完成redirectfromloginpage
結(jié)果如圖:
下面我們修改config.web文件,使得authentication 從config.web中獲得信息和發(fā)生
1. 先設(shè)置config.web 文件
<authentication mode="forms">
<forms name=".aspxuserdemo" loginurl="login.aspx" >
<credentials passwordformat="clear">
<user name="[email protected]" password="ccboy"/>
</credentials>
</forms>
</authentication>
<credentials></credentials>中指定訪問系統(tǒng)資源的用戶名和密碼,并且可以對加密的密碼進行定制和管理(建議實際應(yīng)用中不要將用戶名和密碼放在這里面)
passwordformat可以是“clear”、“sha1”、“md5”等值。
clear:用純文本保存密碼。用戶和密碼不需要進一步的轉(zhuǎn)換可以直接使用和用戶進行比較
sha1:用sha1的哈希分類保存密碼。驗證時將用sha1算法對用戶密碼進行散列,然后同該值進行比較。
md5:同sha1類似,只是使用不同的算法。
當(dāng)使用sha1和md5時還需要一個專門的api(hashpasswordforstoringinconfigfile)來執(zhí)行加密,然后結(jié)果因保存到config.web文件中。具體可以參考下面的鏈接:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguidnf/html/cpconformsauthenticationutilities.asp
2. 然后點擊或在login.aspx 文件的login按鈕的click的事件處理程序中寫入下面的代碼:
void login_click(object sender, eventargs e) {
if ( formsauthentication.authenticate( useremail.value, userpass.value) )
{
formsauthentication.redirectfromloginpage(useremail.value, persistcookie.checked);
}
else {
msg.text = "invalid credentials: please try again";
}
}
結(jié)果和上一個相同,但這次我們把判斷交給了asp.net ap ,我們只傳遞了useremail,userpass兩個參數(shù),authenticate方法將完成authentication過程,這個用戶將和我們在config.web中<user></user>中設(shè)置的相同。
ms文檔《forms authentication using an xml users file》展示了另外一種獲取用戶名和密碼的方式,這種方式為了安全,用戶和密碼被放在一個單獨的xml文件中。具體參考下面的鏈接:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguidnf/html/cpconformsauthenticationutilities.asp
同樣的道理你可以象你以前做得一樣將用戶和密碼放到數(shù)據(jù)庫表中,比如:
void login_click(object sender, eventargs e) {
if(page.isvalid)
{
sqldatareader dr;
// connect to the database
sqlconnection cn = new sqlconnection("server=localhost;
uid=mypassport;pwd=123;database=clientpassword;");
cn.open();
// create a command to get the question
sqlcommand cmdquestion = new sqlcommand("select password;
from users where email = '" + useremail.value + "'", cn);
cmdquestion.execute(out dr);
if(dr.read())
if(dr["password"].tostring() == userpass.value)
formsauthentication.redirectfromloginpage(useremail.value, persistcookie.checked);
else
msg.text = "invalid password. please try again ";
else
msg.text = "email address not found.";
}
}
再同理可以推到這個過程也還可以是調(diào)用帶有商業(yè)邏輯 .net 組件來完成,也可以是調(diào)用另外一個web services來完成,當(dāng)從這個角度來說,已經(jīng)和ms passport 有些相同了。相比起來microsoft的方式是重量級的。
5. mode=”mymode”
這將是以后我們要討論的,asp.net 支持我們使用自己的ap來實現(xiàn)authentication 和 authorization 方案.這將是一種更高級的方式,事實上asp.net 比上一個版本更加的靈活和多樣的選擇。keith brown在11,12月的msdn magazine上都有討論有關(guān)asp.net 的安全性問題。
綜上所述,我們可以看到一個基本的有關(guān)asp.net authentication的情況,其好處是明顯的,但如果你不喜歡iis其本身,那么你也將考慮使用其他的authentication方案。jeff kercher 的《asp .net 中的身份驗證:.net 安全性指導(dǎo)》將可以作為你開始和深入的一個更宏觀的執(zhí)導(dǎo)。
http://www.microsoft.com/china/msdn/library/dnbda/html/authaspdotnet.asp
這篇文章具體講述了各種驗證方案的環(huán)境和優(yōu)劣,從而協(xié)助你選擇和確定最佳的身份驗證方法。
新聞熱點
疑難解答
圖片精選