ASP.NET Authentication Provider
最後更新:2017-02-28
來源:互聯網
上載者:User
asp.net ASP.NET 提供了一些新型的Authentication 和 Authorization 方案,對於開發人員來說這將是和以前不同的一種方式。可喜的是ASP.NET提供的方案多樣更加靈活;可惜的是這種方案是基於IIS的。我知道,有些人並不喜歡IIS,認為它容易受攻擊。只是一直不喜歡ASP的方式,雜亂的HTML標記中夾雜著代碼,難於維護也難於調試。現在有了新的解決方案,讓我們看看。
新型ASP.NET Authentication Provider(下面我會用ASP.NET AP來簡稱)僅僅發生在調用ASP.NET引擎執行.aspx檔案時發生,這也意味著當調用.asp檔案時將不會調用ASP.NET引擎。所有的Authentication選項被放在一個XML檔案中。每當你建立一個ASP.NET的Project時,你可以在Project目錄下發現一個Config.web檔案,在這個XML檔案的<security>, <authentication>, <authorization>等標記中你可以進行設定和控制。預設的是:<authentication mode="None" />,這意味著ASP.NET將不使用任何的Authentication Provider,那麼這種模式下,ASP.NET的底層實現和原來的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”上,最後確定一下我們的平台環境:W2K ADV , VS.NET RCx , IE 6 。(VS.NET Beta2 應該也是可以的,因為寫這篇文章時我的系統已從Beta 2上升級了,所以只能說:我想Beta 2也是可以的。不過我們不會討論mode=”Cookie”的情況,這個標記只發生在ASP+的情況下,Beta 2之後的ASP.NET中應當沒有了),然後我們還會使用到SDK中帶的例子,因為簡單所以可以是最好的一個起點。
然後我們需要簡單的設定一下子,先建立一個目錄C:\Inetpub\wwwroot\Security,然後Copy原來SDK的FrameworkSDK\Samples\QuickStart\aspplus\samples\security中的檔案到建立的目錄中(也可以直接解壓縮附帶檔案到這個目錄中)
1. Mode=”None”
這種模式是預設的,像上面提到的那樣,它的行為和原來的ASP沒有任何的不同。
但你使用VS.NET產生一個ASP.NET 的Project時,這種模式是預設產生的。
2. Mode=”Windows”
這種模式下,我們所訪問的每一個頁面都將需要通過系統的Authentication,訪問者可能看到有些迷惑和Windows環境下特有的Authentication視窗 ,老實說我更喜歡看到 Window XP下的,它更可愛一些。使用這種模式意味著你可以不用額外的寫任何代碼,很快的實現,但我想你的商業使用者不會喜歡它,而且作為一個開發人員,你無法定製它。
現在你實現這種方式將會非常的簡單。
1. 在Config.web 檔案中設定<authentication mode="Windows" />
2. 去IIS的控制管理介面設定你的Application屬性就可以了。如下圖:
3. 然後訪問你的頁面,你會看到這個對話方塊,很有趣但絕對讓非專業人士迷惑。
4. 我們使用的是WindowAuth的頁面。注意Mode=” Windows”,還沒有先進到只用設定好Mode=就可以實現Windows Authentication了。
結果如圖:
3. Mode=”Passport”
對於這種模式下,ASP.NET引擎會使用Microsoft Passport的Authentication機制,理論上這種模式將是最OK和省力的,不過照目前看來,想在ASP.NET下實現Passport還不是一件輕鬆的事情,VS.NET Beta 2的類庫並沒有完全實現Passport 2.1的功能(PassportIdentity). Microsoft目前唯一展示的是在MSDN上的ColdStorage例子,實現上基本基於Passport 1.4而且像使用DirectX 一樣,還需要專門的一個DLL。有資料顯示VS.NET RC2之後的類庫已經實現了原來未實現的功能,但就目前看來缺少這方面的資料,所以把這方面的資訊留給Microsoft和Passport 3.0吧,以後的時間我們會再來考察,對於Passport我深有信心,而且只要在Microsoft平台,我們都可能無法逃避面對Passport.
有關ColdStorage的Passport的資訊,可以參見下面的文章:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncold/html/storageauthentication.asp
4. Mode=”Forms”
這種模式下,我想每個開放人員將獲得最大的靈活性和控制,而且從現在看來,這是最實用和可行的一種方式。先看一個比較簡單的例子:
1. 在Config.Web 檔案中進行下面的設定:
<authentication mode="Forms">
<forms name=".ASPXUSERDEMO" loginUrl="login.aspx" />
</authentication>
loginUrl=”string” 表明未通過Authentication的請求將被定向到的頁面,你可以自行設定。
2. 然後點擊或在login.aspx 檔案的Login按鈕的Click的事件處理常式中寫入下面的代碼:
void Login_Click(Object sender, EventArgs E) {
// authenticate user: this samples accepts only one user with
// a name of new2001@msn.com and a password of 'ccBoy'
if ((UserEmail.Value == "new2001@msn.com") && (UserPass.Value == "ccBoy")) {
FormsAuthentication.RedirectFromLoginPage(UserEmail.Value, PersistCookie.Checked);
}
else {
Msg.Text = "Invalid Credentials: Please try again";
}
}
這裡我們使用的寫入程式碼,目前只允許new2001@msn.com 和 ccBoy作為登入的使用者。測試時我們並不直接存取Login.aspx而是請求default.aspx這個頁面,ASP.NET使用其Authentication機制,將重新定向到Login.aspx,當使用者輸入的資訊被接受則返回最初請求的default.aspx.方式上由於我們使用dotNET的WebUI控制項,更加對象化了,當判斷通過FormsAuthentication 執行RedirectFromLoginPage 方法,這個函數發出Cookie,並把使用者重新定向到最初請求的資源。這種方式下ASP.NET AP做了一半的工作,事實上它是被動的完成RedirectFromLoginPage
結果如圖:
下面我們修改config.web檔案,使得Authentication 從config.web中獲得資訊和發生
1. 先設定config.web 檔案
<authentication mode="Forms">
<forms name=".ASPXUSERDEMO" loginUrl="login.aspx" >
<credentials passwordFormat="Clear">
<user name="ccBoy@msn.com" password="ccboy"/>
</credentials>
</forms>
</authentication>
<credentials></credentials>中指定訪問系統資源的使用者名稱和密碼,並且可以對加密的密碼進行定製和管理(建議實際應用中不要將使用者名稱和密碼放在這裡面)
Passwordformat可以是“Clear”、“SHA1”、“MD5”等值。
Clear:用純文字儲存密碼。使用者和密碼不需要進一步的轉換可以直接使用和使用者進行比較
SHA1:用SHA1的雜湊分類儲存密碼。驗證時將用SHA1演算法對使用者密碼進行散列,然後同該值進行比較。
MD5:同SHA1類似,只是使用不同的演算法。
當使用SHA1和MD5時還需要一個專門的API(HashPasswordForStoringInConfigFile)來執行加密,然後結果因儲存到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";
}
}
結果和上一個相同,但這次我們把判斷交給了ASP.NET AP ,我們只傳遞了UserEmail,UserPass兩個參數,Authenticate方法將完成Authentication過程,這個使用者將和我們在config.web中<user></user>中設定的相同。
MS文檔《Forms Authentication Using An XML Users File》展示了另外一種擷取使用者名稱和密碼的方式,這種方式為了安全,使用者和密碼被放在一個單獨的XML檔案中。具體參考下面的連結:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguidnf/html/cpconformsauthenticationutilities.asp
同樣的道理你可以象你以前做得一樣將使用者和密碼放到資料庫表中,比如:
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.";
}
}
再同理可以推到這個過程也還可以是調用帶有商業邏輯 .NET 組件來完成,也可以是調用另外一個Web Services來完成,當從這個角度來說,已經和MS Passport 有些相同了。相比起來Microsoft的方式是重量級的。
5. Mode=”MyMode”
這將是以後我們要討論的,ASP.NET 支援我們使用自己的AP來實現Authentication 和 Authorization 方案.這將是一種更進階的方式,事實上ASP.NET 比上一個版本更加的靈活和多樣的選擇。Keith Brown在11,12月的MSDN Magazine上都有討論有關ASP.NET 的安全性問題。
綜上所述,我們可以看到一個基本的有關ASP.NET Authentication的情況,其好處是明顯的,但如果你不喜歡IIS其本身,那麼你也將考慮使用其他的Authentication方案。Jeff Kercher 的《ASP .NET 中的身分識別驗證:.NET 安全性指導》將可以作為你開始和深入的一個更宏觀的執導。
http://www.microsoft.com/china/msdn/library/dnbda/html/authaspdotnet.asp
這篇文章具體講述了各種驗證方案的環境和優劣,從而協助你選擇和確定最佳的驗證方法。