| 導購 | 订阅 | 在线投稿
分享
 
 
 

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

來源:互聯網  2008-12-13 08:23:41  評論

先仔細閱讀這段內容: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

  先仔細閱讀這段內容: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項目:[url=http://localhost/test/]http://localhost/test/[/url]   B項目(帶登錄):[url=http://localhost:81/]http://localhost:81/[/url]   從上地址可以看出兩個項目處于不同的域名下,即兩個項目處于兩個不同的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下面找 出處:[url=http://blog.breakn.net/article.asp?id=440]http://blog.breakn.net/article.asp?id=440[/url]
󰈣󰈤
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
王朝網路微信公眾號
微信掃碼關註本站公眾號 wangchaonetcn
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有