摘要
在這篇文章中
Masoud討論了應用ASP
NET中統一身份驗證模型進行跨應用程序驗證的問題
包括
Membership Providers
nfig配置
配置文件的加密解密等
在文章的最後
作者提供了通過ASP
NET login controls來驗證的程序
簡介
通常在你要實現ASP
NET web應用程序的身份驗證時
你需要為你的每一個應用程序創建一個登錄頁面
想象一下
如果你有兩個或者更多的互相關聯的web應用程序
你可能希望通過某種機制為你的所有帶關聯的應用程序實現僅出現一次登錄頁面
這樣
一旦你登錄了一次
你就可以浏覽所有的關聯程序
而不再需要額外的登錄了
單點登錄(SSO)就是這樣的訪問控制機制
它允許一個用戶通過一次驗證就可以訪問所有軟件系統資源
試想你在你的服務器上創建了兩個或者更多的web站點
就像其他的web站點一樣
你只是使用ASP
NET權限驗證機制來驗證你的用戶
那麼
你的這些站點可能需要一個或更多的登錄頁面
現在你正試圖證明怎麼樣通過更改你的配置來實現跨程序登錄
換句話說
我們只想給我們的程序配置一個登錄頁面
並且一旦用戶通過了驗證
他就可以浏覽其他所有的站點
而不需要另外的登錄
在這篇文章的附錄中
你也可以看到如何加密你的配置文件
什麼是單點登錄?它是怎樣工作的?
在許多的公司裡
他們有一些以web站點或web應用程序為表現層的系統
自然
由於安全議題他們將需要通過基於ASP
NET
通過Membership Provider 和 Role Provider 或者定制實現權限驗證和權限驗證系統
不論怎樣
所有的站點都會默認有一個確定用戶的ID和密碼在數據庫中是否有效的
login
aspx
web窗體
當你只有一個站點或者這些站點都是獨立運行時
這樣做是沒有問題的
但是當你有兩個或多個站點
而且站點間是關聯在一起或鏈接在一起的
你沒准就會問
為什麼每個應用程序你都必須登錄一次?為什麼你不可以只有一個
login
aspx
來實現驗證
並讓所有不關聯程序真正統一起來
幸運的是
在ASP
NET
中你可以通過同樣的配置來實現跨應用程序訪問
不論是你的新的站點還是已經存在的站點
在ASP
NET配置文件(nfig)中有一個配置節(在<system
web中)命名為<machineKey>
負責加密和解密窗體(這些窗體可以讀窗體權限驗證cookies)權限認證的cookie數據和view
state數據
也負責校驗進程外(out
of
process)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
)站點中包含一個登錄頁面
Login
aspx
用戶可以通過此頁來進行權限驗證
在這個站點裡還有一個頁面叫做
Default
aspx
它有一個header和一些文本另外還有一個到Aspalliance
站點的鏈接
你將會看到一旦這個用戶登錄了
他可以導航到其他站點而不需要第二次登陸
這裡還有一個安置有兩個加密和解密的按鈕的頁面
Encryption
aspx
用來加密和解密配置文件
就像我之前所說的那樣
你可以通過在你的web配置文件中一點點小小的配置實現跨應用程序訪問
在nfig文件中
有一個名為<system
web>的配置節
我們將對<system
web>做相同的配置
只需要將配置節<machineKey>和它的值放到<system
web>配置節中
<machineKey>有一些屬性
我將要去配置他們
首先
就是指定用來驗證的加密類型
validationKey 定義了用來驗證解密數據的key
decryptionKey定義了用來加密和解密的數據的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>
你可以通過Configuration
SectionInformation兩個類來加密你的配置文件
為了加密和解密你的<machineKey>讓我們來寫一些代碼吧
SectionInformation類有一個方法ProtectSection()
可以得到一個描繪Protection Provider的字符串比如
RSAProctedConfigurationProvider
並且加密這個配置節
這裡還有一個Boolean類型的屬性ForceSave
當需要配置類的save方法保存配置文件時需要將它設置為true
這裡有
Encryption
aspx
頁面的代碼
頁面中包含有兩個按鈕來加密和解密配置文件
清單
: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