熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

理解ASP.NET 2.0中的單點登錄

2013-11-13 09:43:44  來源: .NET編程 
摘要
  在這篇文章中Masoud討論了應用ASPNET中統一身份驗證模型進行跨應用程序驗證的問題包括Membership Providers nfig配置配置文件的加密解密等在文章的最後作者提供了通過ASPNET login controls來驗證的程序
   簡介

  通常在你要實現ASPNET web應用程序的身份驗證時你需要為你的每一個應用程序創建一個登錄頁面想象一下如果你有兩個或者更多的互相關聯的web應用程序你可能希望通過某種機制為你的所有帶關聯的應用程序實現僅出現一次登錄頁面這樣一旦你登錄了一次你就可以浏覽所有的關聯程序而不再需要額外的登錄了單點登錄(SSO)就是這樣的訪問控制機制它允許一個用戶通過一次驗證就可以訪問所有軟件系統資源

  試想你在你的服務器上創建了兩個或者更多的web站點就像其他的web站點一樣你只是使用ASPNET權限驗證機制來驗證你的用戶那麼你的這些站點可能需要一個或更多的登錄頁面現在你正試圖證明怎麼樣通過更改你的配置來實現跨程序登錄換句話說我們只想給我們的程序配置一個登錄頁面並且一旦用戶通過了驗證他就可以浏覽其他所有的站點而不需要另外的登錄在這篇文章的附錄中你也可以看到如何加密你的配置文件

  什麼是單點登錄?它是怎樣工作的?

  在許多的公司裡他們有一些以web站點或web應用程序為表現層的系統自然由於安全議題他們將需要通過基於ASPNET 通過Membership Provider 和 Role Provider 或者定制實現權限驗證和權限驗證系統不論怎樣所有的站點都會默認有一個確定用戶的ID和密碼在數據庫中是否有效的loginaspx web窗體當你只有一個站點或者這些站點都是獨立運行時這樣做是沒有問題的但是當你有兩個或多個站點而且站點間是關聯在一起或鏈接在一起的你沒准就會問為什麼每個應用程序你都必須登錄一次?為什麼你不可以只有一個loginaspx來實現驗證並讓所有不關聯程序真正統一起來幸運的是在ASPNET 中你可以通過同樣的配置來實現跨應用程序訪問不論是你的新的站點還是已經存在的站點

  在ASPNET配置文件(nfig)中有一個配置節(在<systemweb中)命名為<machineKey>負責加密和解密窗體(這些窗體可以讀窗體權限驗證cookies)權限認證的cookie數據和viewstate數據也負責校驗進程外(outofprocess)session 狀態標識所以當用戶一旦被驗證通過並且有一個cookie保存到了本地計算機其他擁有同樣<machineKey>配置的應用程序也可以識別此cookie為有效的權限票據所以在其他擁有同樣<machineKey>配置的應用程序中就不再需要第二次登陸了

  由於<machineKey>信息是敏感的你需要加密配置文件中的此節信息為了實現這個目標我將使用ConfigurationManager類和他的方法這裡還有一個類SectionInformation包含有配置中單個配置節的元數據此類中有個方法ProtectSection()用來解密你的配置文件的配置節

  系統條件

  · A web server running on Windows or later

  · NET Framework

  · Visual Studio

  · Microsoft SQL Server Express Edition

  現在讓我們來看看在我們的項目中發生了什麼我有一個站點(Aspalliance)站點中包含一個登錄頁面Loginaspx用戶可以通過此頁來進行權限驗證在這個站點裡還有一個頁面叫做Defaultaspx它有一個header和一些文本另外還有一個到Aspalliance站點的鏈接你將會看到一旦這個用戶登錄了他可以導航到其他站點而不需要第二次登陸這裡還有一個安置有兩個加密和解密的按鈕的頁面Encryptionaspx用來加密和解密配置文件

  就像我之前所說的那樣你可以通過在你的web配置文件中一點點小小的配置實現跨應用程序訪問在nfig文件中有一個名為<systemweb>的配置節我們將對<systemweb>做相同的配置只需要將配置節<machineKey>和它的值放到<systemweb>配置節中<machineKey>有一些屬性我將要去配置他們首先就是指定用來驗證的加密類型validationKey 定義了用來驗證解密數據的keydecryptionKey定義了用來加密和解密的數據的key抑或是key生成的過程

  清單 : 配置nfig中的machineKey

  <machineKey validationKey=EEBFACBCCDFDDDEAEEADF BDDBFAFECCCDBDBDDD decryptionKey=BCBCABADFAABFDFD validation=SHA/>

  這個樣例代碼並沒有被加密並且它不會被發布到服務器上因為處於安全考慮發布到服務器的<machineKey>的加密是非常重要的你可以在清單中看到加密後的<machineKey>
  清單 : nfig 中加密後的machineKey


  <machineKeyconfigProtectionProvider=RsaProtectedConfigurationProvider> <EncryptedDataType=#Element xmlns=#> <EncryptionMethodAlgorithm=#tripledescbc /> <KeyInfoxmlns=#> <EncryptedKeyxmlns=#> <EncryptionMethodAlgorithm=#rsa_ /> <KeyInfoxmlns=#> <KeyName>Rsa Key</KeyName> </KeyInfo> <CipherData> <CipherValue> lmmfPX/ZmHgdbsmKiIxbrWMt/ugxsBFOAHbIaCtwQgVQusFtOFVUoNVnykgBCehrVEId djNZ/luBNoCbHmOLjgPLHVrT+Gc/LRpESJkni/JysWKXlgejgSQWNEGZtGshu+nkOWxntS zvAM= </CipherValue> </CipherData> </EncryptedKey> </KeyInfo> <CipherData> <CipherValue> BCEGUV/dhImbcmvnKnNrD+EX+KemenRx+VekwTZOy+jRyFRDWMJCfJjHC+MAfCdHuXNrP BhuYUtXVAqNNGrsAIpG+ihuuSHDzQePnlImhpmLyJBovYifbCA++GTMdwCLERk +PVWmoqpqnpNzNqhVKCXlhSySVS+MjJXVeTrcatftpvaUcjLsNcLkMerzfw/SUAbLEuYw dgYWXtWzxqeUcghdlWLDtQiqyyfVfzXPYozRsspWHdgqmAycrACHNdcONWPjTBanRWbouKuPK+ CEFE/HjChpYw== </CipherValue> </CipherData> </EncryptedData> </machineKey>

  你可以通過ConfigurationSectionInformation兩個類來加密你的配置文件為了加密和解密你的<machineKey>讓我們來寫一些代碼吧SectionInformation類有一個方法ProtectSection()可以得到一個描繪Protection Provider的字符串比如RSAProctedConfigurationProvider並且加密這個配置節這裡還有一個Boolean類型的屬性ForceSave當需要配置類的save方法保存配置文件時需要將它設置為true這裡有Encryptionaspx頁面的代碼頁面中包含有兩個按鈕來加密和解密配置文件

  清單 :web配置文件的加密代碼

  protected void btnEncrypt_Click(object sender EventArgs e) { try { Configuration config = WebConfigurationManagerOpenWebConfiguration( /Aspalliance ); ConfigurationSection machineKeySection = configGetSection( systemweb/machineKey); machineKeySectionSectionInformationProtectSection( RSAProtectedConfigurationProvider); machineKeySectionSectionInformationForceSave = true; configSave(); ResponseWrite(<h style=color:red>Encryption Succeed</h>); } catch (Exception ex) { ResponseWrite(<h style=color:red>Error while encrypting</h><br/>); ResponseWrite(exMessage); } }

  清單 : web配置文件的解密代碼


  protected void btnDecrypt_Click(object sender EventArgs e) { try { Configuration config = WebConfigurationManagerOpenWebConfiguration( /Aspalliance ); ConfigurationSection machineKeySection = configGetSection( systemweb/machineKey); machineKeySectionSectionInformationUnprotectSection(); machineKeySectionSectionInformationForceSave = true; configSave(); ResponseWrite(<h style=color:red>Decryption Succeed</h>); } catch (Exception ex) { ResponseWrite(<h style=color:red>Error while decrypting</h><br/>); ResponseWrite(exMessage); } }

  現在你必須在這個站點中設置相同的配置首先你需要更改你的窗體驗證部分的loginUrl這個窗體將被用來將匿名用戶跳轉到Loginaspx只是現在它將把用戶重定向到Aspalliance站點中的Loginaspx

  清單 : 設置 nfig中的驗證節


  <authentication mode=Forms> <forms loginUrl=xname=ASPXAUTH/> </authentication>

  如果你想實現跨程序登錄你的好多站點時最重要的一點就是你必須把你的兩個或更多的站點配置為相同的<machineKey>所以我只需要拷貝並粘貼Aspalliance 站點中的<machineKey>配置節到Aspalliance站點現在都已經准備好了你可以測試你的站點了

  清單 : 設置nfig 中的 machineKey


  <machineKey validationKey=EEBFACBCCDFDDDEAEEADF BDDBFAFECCCDBDBDDD decryptionKey=BCBCABADFAABFDFD validation=SHA/>

  測試這個站點的話可以使用用戶名Admin密碼&來登錄

  這個下載附件中有一個VS 項目其中包含有兩個站點aspalliance and aspalliance

  要安裝這個實例的話你需要創建兩個IIS虛擬目錄命名為aspalliance 和 aspalliance並將地址指向相應的文件夾你也可以通過Visual Studio 打開站點

  當用戶要交叉訪問你的多個站點時他必須重復登陸實在是麻煩所以如果只讓用戶登錄一次那會是非常棒的實現這些你只需要給你的nfig 文件增加具有相同值的<machineKey>配置並且處於安全考慮我建議你加密這個配置節這個加密方法在SectionInformation類中通過ProtectSection()方法被重寫了


From:http://tw.wingwit.com/Article/program/net/201311/11431.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.