跨應用程序進行Forms身份驗證詳解

先仔細閱讀這段內容:ASP.NET 支持在分布式環境中(跨單個服務器上的多個應用程序或在網絡場中)進行 Forms 身份驗證。

之前研究過多站點間的Session共享的問題,這裏說下跨應用程序進行 Forms 身份驗證詳細實現方式,此方案的基礎就是“跨應用程序進行 Forms 身份驗證”(幫助可點擊鏈接或是自己直接查找MSDN)。

在VS2005中建立兩個Web應用程度的項目,兩個項目都添加一個Default.aspx頁面,其中一個項目增加Login.aspx頁面,實現“Forms 身份驗證”。

在兩個項目的Default.aspx.cs代碼頁面添加如下代碼:view plaincopy to clipboardprint?

Response.Write(User.Identity.Name); //輸出當前Form認證後登錄的用戶名

Response.Write(User.Identity.Name); //輸出當前Form認證後登錄的用戶名假設兩個項目的訪問地址如下:

A項目:http://localhost/test/

B項目(帶登錄):http://localhost:81/

從上地址可以看出兩個項目處于不同的域名下,即兩個項目處于兩個不同的Web站點

設置A項目的web.configview plaincopy to clipboardprint?

<authentication mode="Forms">

<!--

這裏loginUrl是指向B項目的登錄頁面

注意:name、protection、path、validationKey、validation、decryptionKey 和 decryption 屬性必須在所有應用程序中都完全相同

-->

<forms loginUrl="http:localhost:81/Login.aspx" path="/" protection="All" defaultUrl="http:localhost:81/Default.aspx" timeout="40" name=".DeESoft">

</forms>

</authentication>

<machineKey

validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE"

decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F"

validation="SHA1" />

<authorization>

<deny users="?" />

</authorization>

<authentication mode="Forms">

<!--

這裏loginUrl是指向B項目的登錄頁面

注意:name、protection、path、validationKey、validation、decryptionKey 和 decryption 屬性必須在所有應用程序中都完全相同

-->

<forms loginUrl="http:localhost:81/Login.aspx" path="/" protection="All" defaultUrl="http:localhost:81/Default.aspx" timeout="40" name=".DeESoft">

</forms>

</authentication>

<machineKey

validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE"

decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F"

validation="SHA1" />

<authorization>

<deny users="?" />

</authorization>再來設置B項目的web.configview plaincopy to clipboardprint?

<authentication mode="Forms">

<!--

注意:name、protection、path、validationKey、validation、decryptionKey 和 decryption 屬性必須在所有應用程序中都完全相同

-->

<forms loginUrl="~/Login.aspx" path="/" protection="All" defaultUrl="~/Default.aspx" timeout="40" name=".DeESoft">

</forms>

</authentication>

<machineKey

validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE"

decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F"

validation="SHA1" />

<authorization>

<deny users="?" />

</authorization>

<authentication mode="Forms">

<!--

注意:name、protection、path、validationKey、validation、decryptionKey 和 decryption 屬性必須在所有應用程序中都完全相同

-->

<forms loginUrl="~/Login.aspx" path="/" protection="All" defaultUrl="~/Default.aspx" timeout="40" name=".DeESoft">

</forms>

</authentication>

<machineKey

validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE"

decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F"

validation="SHA1" />

<authorization>

<deny users="?" />

</authorization>完成並編譯後即可測試,可以訪問A項目的Default.aspx頁面,就會發現頁面已經被跳轉到B項目的登錄頁面中去了,當然也可以在A項目中也設置登錄驗證頁面,登錄後又跳回A項目,顯示當前“User.Identity.Name”的值,然後再在當前窗口訪問B項目的default.aspx,也可以看到同樣的結果,當其中一個項目注銷後,訪問兩個項目的Default.aspx都會跳轉到B項目的登錄頁面。

關鍵部分說完了再來說說Session的問題。如果是常規的Session訪問操作辦法(非存入數據庫),AB兩個站點的Session是無法共享的,但能共享Forms 身份驗證信息,我們就可以根據這個Forms 身份驗證信息中的用戶名來新重新從數據庫中獲取需要存放到Session中的信息,然後存放到Session中供當前項目使用。

基本流程如下:

用戶在A網站登錄 -> A程序根據User.Identity.Name的值取得相關用戶表中的信息 -> 存放到Session["User"]中 -> 此時訪問B項目頁面 -> 程序判斷Session["User"]的值是否是Null -> 如果是Null -> B程序根據User.Identity.Name的值取得相關用戶表中的信息 -> 存放到Session["User"]中

最後再對這個machineKey補充下,你要覺得想省事點直接把MSDN上的加密後key複制一份就行。如果想自己生成一組Key,那麽下載我提供的這個工具(帶原代碼),運行文件在壓縮包中的Bin下面找

出處:http://blog.breakn.net/article.asp?id=440

對PPPServer撥號用戶進行身份驗證
  目的:  在LAN上有多台PPP SERVER,爲了方便記費和帳戶的集中管理,希望能用一台服務器對這幾台PPP SERVER的撥號用戶進行驗證  軟硬件實現環境: RedHat 5.2、一台PPP SERVER(RedHat 5.2)、一台安裝有任意UNIX操...查看完整版>>對PPPServer撥號用戶進行身份驗證
 
在Windows和UNIX下利用PHP和LDAP進行身份驗證
  我現在的老板曾要求我爲企業內部互聯網的Web服務提供一種標准的身份驗證方法。我遇到的一個主要問題就是我們公司主要使用了兩種平台:UNIX和Windows。所以,我的第一個想法並不很成功:它要求每個員工都使用UNIX...查看完整版>>在Windows和UNIX下利用PHP和LDAP進行身份驗證
 
ISA2004Web代理服務拒絕用戶再次進行身份驗證二
  命令完成後,複位對應網絡的Web代理服務(禁用再啓用此網絡的Web代理服務,記得每個步驟都必須點擊 應用 按鈕保存修改和更新防火牆策略)即可。  在此我給大家演示一下:  我在ISA Server 2004的訪問規則中要...查看完整版>>ISA2004Web代理服務拒絕用戶再次進行身份驗證二
 
在Windows和UNIX下利用PHP和LDAP進行身份驗證
  我現在的老板曾要求我爲企業內部互聯網的Web服務提供一種標准的身份驗證方法。我遇到的一個主要問題就是我們公司主要使用了兩種平台:UNIX和Windows。所以,我的第一個想法並不很成功:它要求每個員工都使用UNIX...查看完整版>>在Windows和UNIX下利用PHP和LDAP進行身份驗證
 
在LinuxShell程序中進行身份驗證
  燈稹  inux系統管理員常常碰到的頭痛問題是,在確定系統沒有被入侵的前提下,  不知道哪個豬頭不小心運行了某個特定用途的Shell程序,把系統搞得一塌  糊塗。而且,系統記錄顯示該豬頭使用的是公用帳號...查看完整版>>在LinuxShell程序中進行身份驗證
 
ESMTP協議如何進行身份驗證
ESMTP采取了爲了防止垃圾郵件的泛濫,采用了身份驗證機制。但是在實際的使用過程中,我有時發現我輸入的驗證密碼是正確的,但是系統提示卻是錯誤的,這是什麽原因呢?下面分析ESMTP 的身份驗證機制:(連接到smtp.elo...查看完整版>>ESMTP協議如何進行身份驗證
 
在Linux Shell程序中進行身份驗證[修訂版]
在Linux Shell程序中進行身份驗證by hutuworm◎感謝qjwyk網友指出數字開頭的userid/password無法驗證的問題, 在修訂版中已作改進。 ※緣起Linux系統管理員常常碰到的頭痛問題是,在確定系統沒有被入侵的前提下,不知...查看完整版>>在Linux Shell程序中進行身份驗證[修訂版]
 
ISA2004Web代理服務拒絕用戶再次進行身份驗證一
  前言:可能很多人都遇到過這個問題,當配置ISA防火牆(ISA Server 2004)的Web代理使用集成身份驗證時,如果當前登錄的用戶沒能通過驗證,那麽ISA防火牆就會直接拒絕用戶的訪問,而不是和ISA Server 2000中一樣彈...查看完整版>>ISA2004Web代理服務拒絕用戶再次進行身份驗證一
 
在Linux Shell程序中進行身份驗證
在Linux Shell程序中進行身份驗證 by hutuworm ※緣起 Linux系統管理員常常碰到的頭痛問題是,在確定系統沒有被入侵的前提下, 不知道哪個豬頭不小心運行了某個特定用途的Shell程序,把系統搞得一塌 糊塗。而且,系...查看完整版>>在Linux Shell程序中進行身份驗證
 
 
回到王朝網路移動版首頁