ASP.NET2.0中的單點登錄簡介及實現
在這篇文章中,Masoud討論了應用asp.net中統一身份驗證模型進行跨應用程序驗證的問題,包括:Membership Providers, web.config配置,配置文件的加密解密等。在文章的最后,作者提供了通過asp.net login controls來驗證的程序。
by Masoud Tabatabaei:
通常在你要實現asp.net web應用程序的身份驗證時,你需要為你的每一個應用程序創建一個登錄頁面。想象一下,如果你有兩個或者更多的互相關聯的web應用程序,你可能希望通過某種機制為你的所有帶關聯的應用程序實現僅出現一次登錄頁面。這樣,一旦你登錄了一次,你就可以瀏覽所有的關聯程序,而不再需要額外的登錄了。單點登錄(SSO)就是這樣的訪問控制機制,它允許一個用戶通過一次驗證就可以訪問所有軟件系統資源。
試想你在你的服務器上創建了兩個或者更多的web站點。就像其他的web站點一樣,你只是使用asp.net權限驗證機制來驗證你的用戶。那么,你的這些站點可能需要一個或更多的登錄頁面。現在你正試圖證明怎么樣通過更改你的配置來實現跨程序登錄。換句話說,我們只想給我們的程序配置一個登錄頁面,并且一旦用戶通過了驗證,他就可以瀏覽其他所有的站點,而不需要另外的登錄。在這篇文章的附錄中,你也可以看到如何加密你的配置文件。
ASP.NET2.0中的單點登錄簡介:什么是單點登錄?它是怎樣工作的?
在許多的公司里,他們有一些以web站點或web應用程序為表現層的系統。自然,由于安全議題他們將需要通過基于asp.net 2.0,通過Membership Provider 和 Role Provider 或者定制實現權限驗證和權限驗證系統。不論怎樣,所有的站點都會默認有一個確定用戶的ID和密碼在數據庫中是否有效的”login.aspx” web窗體.當你只有一個站點或者這些站點都是獨立運行時,這樣做是沒有問題的。但是當你有兩個或多個站點,而且站點間是關聯在一起或鏈接在一起的,你沒準就會問:為什么每個應用程序你都必須登錄一次?為什么你不可以只有一個”login.aspx”來實現驗證,并讓所有不關聯程序真正統一起來。幸運的是,在asp.net 2.0中你可以通過同樣的配置來實現跨應用程序訪問,不論是你的新的站點還是已經存在的站點。
在asp.net配置文件(web.config)中有一個配置節(在< system.web中)命名為< machineKey>,負責加密和解密窗體(這些窗體可以讀窗體權限驗證cookies)權限認證的cookie數據和view-state數據,也負責校驗進程外(out-of-process)session 狀態標識。所以當用戶一旦被驗證通過并且有一個cookie保存到了本地計算機,其他擁有同樣< machineKey>配置的應用程序也可以識別此cookie為有效的權限票據。所以在其他擁有同樣< machineKey>配置的應用程序中就不再需要第二次登陸了。
由于< machineKey>信息是敏感的,你需要加密配置文件中的此節信息。為了實現這個目標,我將使用ConfigurationManager類和他的方法。這里還有一個類SectionInformation,包含有配置中單個配置節的元數據。此類中有個方法ProtectSection(),用來解密你的配置文件的配置節。
ASP.NET2.0中單點登錄配置:系統條件
·A web server running on Windows 2000 or later
·.NET Framework 2.0
·Visual Studio 2005
·Microsoft SQL Server 2005 Express Edition
現在讓我們來看看在我們的項目中發生了什么。我有一個站點(Aspalliance1)站點中包含一個登錄頁面”Login.aspx”.用戶可以通過此頁來進行權限驗證。在這個站點里還有一個頁面叫做”Default.aspx”,它有一個header和一些文本另外還有一個到Aspalliance2站點的鏈接。你將會看到一旦這個用戶登錄了,他可以導航到其他站點而不需要第二次登陸。這里還有一個安置有兩個加密和解密的按鈕的頁面”Encryption.aspx”,用來加密和解密配置文件。
就像我之前所說的那樣,你可以通過在你的web配置文件中一點點小小的配置實現跨應用程序訪問。在web.config文件中,有一個名為< system.web>的配置節。我們將對< system.web>做相同的配置,只需要將配置節< machineKey>和它的值放到< system.web>配置節中。< machineKey>有一些屬性,我將要去配置他們。首先,就是指定用來驗證的加密類型。validationKey 定義了用來驗證解密數據的key,decryptionKey定義了用來加密和解密的數據的key,抑或是key生成的過程。
清單 1: 配置web.config中的machineKey
- < machineKey
- validationKey="282487E295028E59B8F411ACB689CCD6F39DDD21E6055A3EE480424315994760ADF
- 21B580D8587DB675FA02F79167413044E25309CCCDB647174D5B3D0DD9141"
- decryptionKey="8B6697227CBCA902B1A0925D40FAA00B353F2DF4359D2099"
- validation="SHA1"/>
這個樣例代碼并沒有被加密,并且它不會被發布到服務器上。因為處于安全考慮,發布到服務器的< machineKey>的加密是非常重要的。你可以在清單2中看到加密后的< machineKey>。
清單 2: web.config 中加密后的machineKey
- < machineKeyconfigProtectionProvider="RsaProtectedConfigurationProvider">
- < EncryptedDataType="http://www.w3.org/2001/04/xmlenc#Element"
- xmlns="http://www.w3.org/2001/04/xmlenc#">
- < EncryptionMethodAlgorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
- < KeyInfoxmlns="http://www.w3.org/2000/09/xmldsig#">
- < EncryptedKeyxmlns="http://www.w3.org/2001/04/xmlenc#">
- < EncryptionMethodAlgorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
- < KeyInfoxmlns="http://www.w3.org/2000/09/xmldsig#">
- < KeyName>Rsa Key< /KeyName>
- < /KeyInfo>
- < CipherData>
- < CipherValue>
- lm3mfPX/94Zm3HgdbsmKiIxbrWM14t3/ugxs40BFOAHbIaCtwQ3gVQusFtOFVUoNVny01kgBCeh10rVEId
- djNZ/8luBNoCbHm8OLjgPLHVrT+G0c/LRpESJk2ni/Jy2sWKXlgejgSQ1W5NE53GZtG3s9hu+nk4OWxntS
- 6z3v7AM=
- < /CipherValue>
- < /CipherData>
- < /EncryptedKey>
- < /KeyInfo>
- < CipherData>
- < CipherValue>
- BCEGUV/dh1Imbcm5vn0Kn8NrD+EX+KemenR7x+VekwT1ZO6y5+jRyF4RDWMJCfJ1jHC36+MAfCdHuXN0rP
- B6hu5YUtX9VA5q5N0NGrs9AIpG+0ihuuS3HDzQe3P6nlI30m1h0pmL1yJBovY0i6fbCA6++GT2MdwCLERk
- +PVWmoq7p1q97n5pNzNqhVKCX45lhS5ySVS+MjJXVeTrcatftpvaUcjLsNcL2kMerzf5w/SU3AbLEuY04w
- dgYWX5tWzxqeUcghdlWLD0tQi8qyyfVfzXPYozR5sspWHdgqmAycrACHN2dcONWPjT4BanRWb1ouKuP8K+
- 0CEFE/Hj2ChpYw==
- < /CipherValue>
- < /CipherData>
- < /EncryptedData>
- < /machineKey>
你可以通過Configuration、SectionInformation兩個類來加密你的配置文件。為了加密和解密你的< machineKey>讓我們來寫一些代碼吧。SectionInformation類有一個方法ProtectSection(),可以得到一個描繪Protection Provider的字符串比如"RSAProctedConfigurationProvider",并且加密這個配置節。這里還有一個Boolean類型的屬性ForceSave,當需要配置類的save方法保存配置文件時需要將它設置為true。這里有"Encryption.aspx"頁面的代碼,頁面中包含有兩個按鈕來加密和解密配置文件。
清單 3:web配置文件的加密代碼
- protected void btnEncrypt_Click(object sender, EventArgs e)
- {
- try
- {
- Configuration config = WebConfigurationManager.OpenWebConfiguration(
- "/Aspalliance1 ");
- ConfigurationSection machineKeySection = config.GetSection(
- "system.web/machineKey");
- machineKeySection.SectionInformation.ProtectSection(
- "RSAProtectedConfigurationProvider");
- machineKeySection.SectionInformation.ForceSave = true;
- config.Save();
- Response.Write("< h2 style='color:red'>Encryption Succeed< /h2>");
- }
- catch (Exception ex)
- {
- Response.Write("< h2 style='color:red'>Error while encrypting< /h2>< br/>");
- Response.Write(ex.Message);
- }
- }
清單 4: web配置文件的解密代碼
- protected void btnDecrypt_Click(object sender, EventArgs e)
- {
- try
- {
- Configuration config = WebConfigurationManager.OpenWebConfiguration(
- "/Aspalliance1 ");
- ConfigurationSection machineKeySection = config.GetSection(
- "system.web/machineKey");
- machineKeySection.SectionInformation.UnprotectSection();
- machineKeySection.SectionInformation.ForceSave = true;
- config.Save();
- Response.Write("< h2 style='color:red'>Decryption Succeed< /h2>");
- }
- catch (Exception ex)
- {
- Response.Write("< h2 style='color:red'>Error while decrypting< /h2>< br/>");
- Response.Write(ex.Message);
- }
- }
現在你必須在這個站點中設置相同的配置。首先你需要更改你的窗體驗證部分的loginUrl,這個窗體將被用來將匿名用戶跳轉到”Login.aspx”頁。只是,現在它將把用戶重定向到Aspalliance1站點中的”Login.aspx”頁。
清單 5: 設置 web.config中的驗證節
- < authentication mode="Forms">
- < forms loginUrl="http://localhost/Aspalliance1/login.aspx"name=".ASPXAUTH"/>
- < /authentication>
如果你想實現跨程序登錄你的好多站點時,最重要的一點就是你必須把你的兩個或更多的站點配置為相同的< machineKey>。所以我只需要拷貝并粘貼Aspalliance1 站點中的< machineKey>配置節到Aspalliance2站點。現在都已經準備好了,你可以測試你的站點了。
清單 6: 設置web.config 中的 machineKey
- < machineKey
- validationKey="282487E295028E59B8F411ACB689CCD6F39DDD21E6055A3EE480424315994760ADF
- 21B580D8587DB675FA02F79167413044E25309CCCDB647174D5B3D0DD9141"
- decryptionKey="8B6697227CBCA902B1A0925D40FAA00B353F2DF4359D2099"
- validation="SHA1"/>
[下載]
測試這個站點的話,可以使用用戶名:Admin密碼:123456&來登錄。
這個下載附件中有一個VS 2005項目,其中包含有兩個站點:aspalliance1 and aspalliance2.
要安裝這個實例的話,你需要創建兩個IIS虛擬目錄命名為:aspalliance1 和 aspalliance2,并將地址指向相應的文件夾。你也可以通過Visual Studio 2005打開站點。
當用戶要交叉訪問你的多個站點時,他必須重復登陸實在是麻煩。所以,如果只讓用戶登錄一次,那會是非常棒的。實現這些,你只需要給你的"web.config" 文件增加具有相同值的< machineKey>配置。并且處于安全考慮,我建議你加密這個配置節。這個加密方法在SectionInformation類中通過ProtectSection()方法被重寫了。以上便是ASP.NET2.0中單點登錄的實現方法。
【編輯推薦】