ASP.NET 安全认证(四)
生活随笔
收集整理的這篇文章主要介紹了
ASP.NET 安全认证(四)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
第四部分 Form 認(rèn)證的補(bǔ)充
前三篇在 CSDN 論壇公布后,效果如同“神仙放屁——果然不同凡(反)響”。為感謝廣大網(wǎng)友的熱情與支持,這不,經(jīng)過這一陣子的醞釀、修煉,特意準(zhǔn)備了這第四響。
之前我們講述的使用 Form 認(rèn)證實(shí)現(xiàn)單點(diǎn)登錄,正如網(wǎng)友所說的那樣,只能在同一域名下使用。對(duì)于跨域名的單點(diǎn)登錄,除了使用 Passport 認(rèn)證外,我們還是可以用 Form 認(rèn)證的,只是要講究方法而已啦。正所謂“山不轉(zhuǎn)水轉(zhuǎn),人不轉(zhuǎn)心轉(zhuǎn)”。?
?一、??????? 跨域名的解決思路 在MSDN 2003 上搜索關(guān)鍵字“Passport”,偶找到一篇“Passport 身份驗(yàn)證提供程序”。文章講述了 Passport 的認(rèn)證原理,共 8 條,我就不多說了,大伙自個(gè)看吧。其中有一句話,引起偶的注意:“……響應(yīng)在查詢字符串中包含一個(gè)加密的 Passport Cookie……”。也正是此句才有了下面的思路。 所謂認(rèn)證的通過與否,其實(shí)質(zhì)就是檢測有無發(fā)放有效的 Cookie ,使用 Form 也好,運(yùn)用 Passport 也罷,都是 Cookie 在起作用。也就是說,我們只要把有效的 Cookie 在登錄后一次性發(fā)放給客戶端就得了。 二、??????? 跨域名、跨服務(wù)器的單點(diǎn)登錄方法 1、?如何在本機(jī)模擬跨域名、跨服務(wù)器的Single Sign On 只要瀏覽網(wǎng)址不同就相當(dāng)于不同域名,在本機(jī)至少有以下三種。它們雖然是同一項(xiàng)目,彼此卻不能共用 Session與 Cookie ,也就無法共享身份驗(yàn)證票: a). http://localhost/FormTest/Login.aspx b). http://127.0.0.1/FormTest/Login.aspx c). http://My_Computer_Name/FormTest/Login.aspx?//以電腦名稱瀏覽站點(diǎn) d). http://192.168.0.8/FormTest/Login.aspx?//以網(wǎng)卡地址瀏覽站點(diǎn) e). http://172.meibu.com/FormTest/Login.aspx?//擁有國際域名 2、?在 ASP.NET 中如何提交給其它頁面 用過ViewState 的大概都知道,ViewState是保存在客戶端的。不知大伙注意沒有,ASP.NET 為每張 .aspx 頁面都配備了獨(dú)自的 ViewState,且被解析后都是以一個(gè) name="__VIEWSTATE"的隱藏控件值來保存ViewState。每次頁面提交,服務(wù)器都會(huì)檢查該控件的值有無被篡改,如此一來就注定 .aspx 只能提交給本頁。服務(wù)器是死的,人是活的,我們不能被這些條條框框限定死了,我們要把程序?qū)懗苫畹摹? 下面咱們從 http://localhost/FormTest/Login.aspx 輸入用戶名與密碼,然后提交給http://127.0.0.1/FormTest/Public/LoginTransfer.aspx 。Login.aspx與LoginTransfer.aspx都包含用戶名輸入框一個(gè)、密碼輸入框一個(gè)、登錄按鈕一個(gè)。在 Login.aspx 頁面加入以下代碼: this.Btn_Login.Attributes["onclick"]="SingleSignOn()"; //指定執(zhí)行腳本事件 在 Login.aspx 頁面上插入以下腳本: <script language="javascript"> function SingleSignOn() { //只能用腳本改變指定Form 提交的對(duì)象 document.getElementById("Form1").action="http://127.0.0.1/FormTest/Public/LoginTransfer.aspx?FromUrl="+window.location.href; //把隱藏控件 __VIEWSTATE 中的值變更為 LoginTransfer.aspx 解析后出現(xiàn)的值,以實(shí)際看到的值為準(zhǔn) document.all.__VIEWSTATE.value = "dDwtMTkyODUzMTMyNzs7Pv1cp2RaxUcr5hGYf8ILX9/EMKy8"; } </script> 注意事項(xiàng) a). ?LoginTransfer.aspx 出現(xiàn)的控件及其 ID ,必須能夠在 Login.aspx 找到 b). 控件的 ID 必須一致,且能一一對(duì)應(yīng) c). 關(guān)于 __VIEWSTATE中的值,它與頁面控件ID 無關(guān),與瀏覽該頁面的網(wǎng)址無關(guān),目前我只知道和控件的數(shù)量、類型、名字空間(namespace FormTest.Public )以及存在的 ViewState有關(guān)系。大家在測試時(shí),以直接瀏覽http://127.0.0.1/FormTest/Public/LoginTransfer.aspx 后,查看頁面源文件所看到的值為準(zhǔn)。 d). 提交后,將觸發(fā)并執(zhí)行LoginTransfer.aspx 中的Btn_Login_Click 事件 3、?基本思路 各個(gè)站點(diǎn)的登錄頁面統(tǒng)一將用戶名與密碼提交給 LoginTransfer.aspx ,同時(shí)各個(gè)站點(diǎn)需要一個(gè)增加 Cookie 的頁面,用于將加密后的身份驗(yàn)證 Cookie 添加至客戶端。此乃經(jīng)過一番考量后,最終確定的可行性方案。 4、?第一種思路——天女散花 何謂天女散花,就是把 Cookie 在登錄后一次性全發(fā)放出去,就如同天仙在空中散花一樣,場面是何等的壯觀。下面開始寫代碼: 為更好的區(qū)分,我們將負(fù)責(zé)添加 Cookie 的頁面分開命名: a). http://localhost/FormTest/Public/AddCookie_A.aspx b). http://127.0.0.1/FormTest/Public/AddCookie_B.aspx c). http://My_Computer_Name/FormTest/Public/AddCookie_C.aspx 這三張頁面的功能一樣,所以代碼也就相同啰 private void Page_Load(object sender, System.EventArgs e) { string from = Request["FromUrl"];???????? //起始URL 路徑 string next = Request["NextUrl"];???????? //還需要跳轉(zhuǎn)的URL string key = Request["CookieTicket"]; ???? //已加密的Cookie 文本 if(key != null && key !="") { System.Web.HttpCookie ck = new HttpCookie(System.Web.Security.FormsAuthentication.FormsCookieName,key); ck.Path=System.Web.Security.FormsAuthentication.FormsCookiePath; ck.Expires = System.DateTime.Now.AddYears(100); Response.Cookies.Add(ck); //將傳過來的已加密的身份驗(yàn)證票添加至客房端 string url = next.Split(';')[0]; //從 URL 中拆分出將要跳轉(zhuǎn)的下一張頁面 next = next.Replace(url+";",""); //帶入下一輪跳轉(zhuǎn)的字串 if(url!="") { //跳至下一頁面Response.Redirect(url+"?CookieTicket="+key+"&FromUrl="+from+"&NextUrl="+next); } else???? //已沒有下一頁面可供跳轉(zhuǎn) { Response.Redirect(from);??? //回到起始頁面 } } } 接下來編寫 LoginTransfer.aspx 的代碼: //頁面常量 allLoginUrl 存放所有站點(diǎn)的 AddCookie.aspx 的 URL,注意以 ; 分隔 public const string allLoginUrl =??? "http://localhost/FormTest/Public/AddCookie_A.aspx;" +"http://127.0.0.1/FormTest/Public/AddCookie_B.aspx;" +"http://My_Computer_Name/FormTest/Public/AddCookie_C.aspx;"; 偶已在上面講述了,如何點(diǎn)擊 Login.aspx 中的登錄按鈕Btn_Login將用戶名與密碼提交給 LoginTransfer.aspx ,并執(zhí)行LoginTransfer.aspx 中的Btn_Login_Click 事件。 private void Btn_Login_Click(object sender, System.EventArgs e) { string from = Request["FromUrl"];??? //起始 URL 路徑 string next = this.allLoginUrl;? //由于控件 ID 相同,所以此處得到的是由 Login.aspx 提交過來的用戶名與密碼 if(this.Txt_LoginName.Text=="Admin"&&this.Txt_Password.Text=="123456") { System.Web.Security.FormsAuthenticationTicket tk = new System.Web.Security.FormsAuthenticationTicket(1,"Admin", System.DateTime.Now, System.DateTime.Now.AddYears(100),false,"測試用戶數(shù)據(jù)"?); string key = System.Web.Security.FormsAuthentication.Encrypt(tk); //得到加密后的身份驗(yàn)證票字串 string url = next.Split(';')[0]; //從URL 中拆分出將要跳轉(zhuǎn)的下一張頁面 next = next.Replace(url+";",""); //帶入下一輪跳轉(zhuǎn)的字串 Response.Redirect(url+"?CookieTicket="+key+"&FromUrl="+from+"&NextUrl="+next); //跳至下一頁面 }??????? } 5、?第二種思路——后羿射日 后羿射日,意思指的是用戶點(diǎn)哪就跳哪。他若是點(diǎn)“火坑”,你也得往里跳,因?yàn)橛脩羰巧系勐铩N覀冊(cè)黾右粋€(gè)通行證頁面 MyPassport.aspx ,由 http://127.0.0.1/FormTest/Public/LoginTransfer.aspx 發(fā)放驗(yàn)證 Cookie 后直接跳轉(zhuǎn)至 http://127.0.0.1/FormTest/MyPassport.aspx 。不要告訴我你不會(huì),你要是真不會(huì),那偶也沒法子啦,還得請(qǐng)你回頭看看,偶在第三篇是如何講述發(fā)放永久性驗(yàn)證 Cookie 吧(http://blog.csdn.net/cityhunter172/archive/2005/12/06/545301.aspx)。還需要一張用作跳板的跳轉(zhuǎn)頁面 MyTransfer.aspx 。 MyPassport.aspx 的代碼: <a target ="_blank" href="MyTransfer.aspx?goto=http://localhost/FormTest/Public/AddCookie_D.aspx"> 美麗的天使</a> <a target ="_blank" href="MyTransfer.aspx?goto=http://127.0.0.1/FormTest/Public/AddCookie_E.aspx"> 快樂的天堂</a> <atarget ="_blank" href="MyTransfer.aspx?goto=http://My_Computer_Name/FormTest/Public/AddCookie_F.aspx"> 大大的火坑</a> MyTransfer.aspx 的代碼: private void Page_Load(object sender, System.EventArgs e) { //獲取身份驗(yàn)證票 System.Web.Security.FormsAuthenticationTicket tk =((System.Web.Security.FormsIdentity)User.Identity).Ticket; string key = System.Web.Security.FormsAuthentication.Encrypt(tk); //每次加密后的字串都是不同的 string next = Request["goto"]; //將要跳轉(zhuǎn)的URL Response.Redirect(url+"?CookieTicket="+key); //跳轉(zhuǎn)至下一頁面 } AddCookie_D.aspx、AddCookie_E.aspx、AddCookie_F.aspx 這三張頁面的代碼: string key = Request["CookieTicket"]; //已加密的 Cookie 文本 if(key != null && key !="") { System.Web.HttpCookie ck = new HttpCookie(System.Web.Security.FormsAuthentication.FormsCookieName,key); ck.Path=System.Web.Security.FormsAuthentication.FormsCookiePath; ck.Expires = System.DateTime.Now.AddYears(100); Response.Cookies.Add(ck); //將傳過來的已加密的身份驗(yàn)證票添加至客房端 Response.Redirect("../Index.aspx"); //跳轉(zhuǎn)至你真正想帶客戶去的地方 } 6、?點(diǎn)評(píng) 兩者共同點(diǎn): a). 每個(gè)站點(diǎn)都需要一個(gè)登錄的提交點(diǎn)、一張?zhí)砑?Cookie 的頁面。 b). 因?yàn)橹荒芸堪l(fā)放驗(yàn)證 Cookie 來識(shí)別身份,所以一臺(tái)電腦不能同時(shí)登錄兩個(gè)帳號(hào)。 c). 都存在不同程度的安全隱患。 兩者不同點(diǎn):(天女散花以下簡稱“開女”,后羿射日就簡稱“后羿”) a). 天女一次性發(fā)放 Cookie ,如果站點(diǎn)較多,處理起來還是需要一些時(shí)間的。而后羿則相反,站點(diǎn)再多也不怕。 b). 天女在散花的過程中,如果中途被卡住,則需要一個(gè)錯(cuò)誤處理機(jī)制做回退處理。后羿則不需要。 c). 天女在登錄后可以直接在 IE 地址瀏覽其想看的站點(diǎn);而后羿則必須從通行證的跳板頁面進(jìn)入才行。 根據(jù)上述問題,給幾點(diǎn)建議: a). 不要使用永久性 Cookie ,應(yīng)指明身份驗(yàn)證票的過期時(shí)間,注意不是 Cookie 的有效期。 b). 在身份驗(yàn)證票的 UserData 中加入其它的驗(yàn)證信息或存放用戶 ID c). 在網(wǎng)絡(luò)通暢的情況下,比如局域網(wǎng),站點(diǎn)又相對(duì)較少,建議選用天女。50 個(gè)站點(diǎn)之間做跳轉(zhuǎn)應(yīng)該不會(huì)超過 10 秒(前提是已編譯好了,且不是初次訪問)。 三、??????? 跨域名、跨服務(wù)器的退出方法 只要理解了“天女散花”,退出就比較容易啦。為每個(gè)站點(diǎn)準(zhǔn)備一個(gè)用于退出的頁面,如下: a). http://localhost/FormTest/Public/Logout.aspx b). http://127.0.0.1/FormTest/Public/Logout.aspx c). http://My_Computer_Name/Public/FormTest/Logout.aspx private void Page_Load(object sender, System.EventArgs e) { System.Web.Security.FormsAuthentication.SignOut();//刪除 Cookie 中的身份驗(yàn)證票 string from = Request["FromUrl"]; string next = Request["NextUrl"]; string url = next.Split(';')[0]; next = next.Replace(url+";",""); if(url!="") { Response.Redirect(url+"?FromUrl="+from+"&NextUrl="+next); } else { Response.Redirect(from); } } 對(duì)啦,還有一張 LogoutTransfer.aspx. ,代碼偶就不寫,大家自個(gè)完成吧。
前三篇在 CSDN 論壇公布后,效果如同“神仙放屁——果然不同凡(反)響”。為感謝廣大網(wǎng)友的熱情與支持,這不,經(jīng)過這一陣子的醞釀、修煉,特意準(zhǔn)備了這第四響。
之前我們講述的使用 Form 認(rèn)證實(shí)現(xiàn)單點(diǎn)登錄,正如網(wǎng)友所說的那樣,只能在同一域名下使用。對(duì)于跨域名的單點(diǎn)登錄,除了使用 Passport 認(rèn)證外,我們還是可以用 Form 認(rèn)證的,只是要講究方法而已啦。正所謂“山不轉(zhuǎn)水轉(zhuǎn),人不轉(zhuǎn)心轉(zhuǎn)”。?
?一、??????? 跨域名的解決思路 在MSDN 2003 上搜索關(guān)鍵字“Passport”,偶找到一篇“Passport 身份驗(yàn)證提供程序”。文章講述了 Passport 的認(rèn)證原理,共 8 條,我就不多說了,大伙自個(gè)看吧。其中有一句話,引起偶的注意:“……響應(yīng)在查詢字符串中包含一個(gè)加密的 Passport Cookie……”。也正是此句才有了下面的思路。 所謂認(rèn)證的通過與否,其實(shí)質(zhì)就是檢測有無發(fā)放有效的 Cookie ,使用 Form 也好,運(yùn)用 Passport 也罷,都是 Cookie 在起作用。也就是說,我們只要把有效的 Cookie 在登錄后一次性發(fā)放給客戶端就得了。 二、??????? 跨域名、跨服務(wù)器的單點(diǎn)登錄方法 1、?如何在本機(jī)模擬跨域名、跨服務(wù)器的Single Sign On 只要瀏覽網(wǎng)址不同就相當(dāng)于不同域名,在本機(jī)至少有以下三種。它們雖然是同一項(xiàng)目,彼此卻不能共用 Session與 Cookie ,也就無法共享身份驗(yàn)證票: a). http://localhost/FormTest/Login.aspx b). http://127.0.0.1/FormTest/Login.aspx c). http://My_Computer_Name/FormTest/Login.aspx?//以電腦名稱瀏覽站點(diǎn) d). http://192.168.0.8/FormTest/Login.aspx?//以網(wǎng)卡地址瀏覽站點(diǎn) e). http://172.meibu.com/FormTest/Login.aspx?//擁有國際域名 2、?在 ASP.NET 中如何提交給其它頁面 用過ViewState 的大概都知道,ViewState是保存在客戶端的。不知大伙注意沒有,ASP.NET 為每張 .aspx 頁面都配備了獨(dú)自的 ViewState,且被解析后都是以一個(gè) name="__VIEWSTATE"的隱藏控件值來保存ViewState。每次頁面提交,服務(wù)器都會(huì)檢查該控件的值有無被篡改,如此一來就注定 .aspx 只能提交給本頁。服務(wù)器是死的,人是活的,我們不能被這些條條框框限定死了,我們要把程序?qū)懗苫畹摹? 下面咱們從 http://localhost/FormTest/Login.aspx 輸入用戶名與密碼,然后提交給http://127.0.0.1/FormTest/Public/LoginTransfer.aspx 。Login.aspx與LoginTransfer.aspx都包含用戶名輸入框一個(gè)、密碼輸入框一個(gè)、登錄按鈕一個(gè)。在 Login.aspx 頁面加入以下代碼: this.Btn_Login.Attributes["onclick"]="SingleSignOn()"; //指定執(zhí)行腳本事件 在 Login.aspx 頁面上插入以下腳本: <script language="javascript"> function SingleSignOn() { //只能用腳本改變指定Form 提交的對(duì)象 document.getElementById("Form1").action="http://127.0.0.1/FormTest/Public/LoginTransfer.aspx?FromUrl="+window.location.href; //把隱藏控件 __VIEWSTATE 中的值變更為 LoginTransfer.aspx 解析后出現(xiàn)的值,以實(shí)際看到的值為準(zhǔn) document.all.__VIEWSTATE.value = "dDwtMTkyODUzMTMyNzs7Pv1cp2RaxUcr5hGYf8ILX9/EMKy8"; } </script> 注意事項(xiàng) a). ?LoginTransfer.aspx 出現(xiàn)的控件及其 ID ,必須能夠在 Login.aspx 找到 b). 控件的 ID 必須一致,且能一一對(duì)應(yīng) c). 關(guān)于 __VIEWSTATE中的值,它與頁面控件ID 無關(guān),與瀏覽該頁面的網(wǎng)址無關(guān),目前我只知道和控件的數(shù)量、類型、名字空間(namespace FormTest.Public )以及存在的 ViewState有關(guān)系。大家在測試時(shí),以直接瀏覽http://127.0.0.1/FormTest/Public/LoginTransfer.aspx 后,查看頁面源文件所看到的值為準(zhǔn)。 d). 提交后,將觸發(fā)并執(zhí)行LoginTransfer.aspx 中的Btn_Login_Click 事件 3、?基本思路 各個(gè)站點(diǎn)的登錄頁面統(tǒng)一將用戶名與密碼提交給 LoginTransfer.aspx ,同時(shí)各個(gè)站點(diǎn)需要一個(gè)增加 Cookie 的頁面,用于將加密后的身份驗(yàn)證 Cookie 添加至客戶端。此乃經(jīng)過一番考量后,最終確定的可行性方案。 4、?第一種思路——天女散花 何謂天女散花,就是把 Cookie 在登錄后一次性全發(fā)放出去,就如同天仙在空中散花一樣,場面是何等的壯觀。下面開始寫代碼: 為更好的區(qū)分,我們將負(fù)責(zé)添加 Cookie 的頁面分開命名: a). http://localhost/FormTest/Public/AddCookie_A.aspx b). http://127.0.0.1/FormTest/Public/AddCookie_B.aspx c). http://My_Computer_Name/FormTest/Public/AddCookie_C.aspx 這三張頁面的功能一樣,所以代碼也就相同啰 private void Page_Load(object sender, System.EventArgs e) { string from = Request["FromUrl"];???????? //起始URL 路徑 string next = Request["NextUrl"];???????? //還需要跳轉(zhuǎn)的URL string key = Request["CookieTicket"]; ???? //已加密的Cookie 文本 if(key != null && key !="") { System.Web.HttpCookie ck = new HttpCookie(System.Web.Security.FormsAuthentication.FormsCookieName,key); ck.Path=System.Web.Security.FormsAuthentication.FormsCookiePath; ck.Expires = System.DateTime.Now.AddYears(100); Response.Cookies.Add(ck); //將傳過來的已加密的身份驗(yàn)證票添加至客房端 string url = next.Split(';')[0]; //從 URL 中拆分出將要跳轉(zhuǎn)的下一張頁面 next = next.Replace(url+";",""); //帶入下一輪跳轉(zhuǎn)的字串 if(url!="") { //跳至下一頁面Response.Redirect(url+"?CookieTicket="+key+"&FromUrl="+from+"&NextUrl="+next); } else???? //已沒有下一頁面可供跳轉(zhuǎn) { Response.Redirect(from);??? //回到起始頁面 } } } 接下來編寫 LoginTransfer.aspx 的代碼: //頁面常量 allLoginUrl 存放所有站點(diǎn)的 AddCookie.aspx 的 URL,注意以 ; 分隔 public const string allLoginUrl =??? "http://localhost/FormTest/Public/AddCookie_A.aspx;" +"http://127.0.0.1/FormTest/Public/AddCookie_B.aspx;" +"http://My_Computer_Name/FormTest/Public/AddCookie_C.aspx;"; 偶已在上面講述了,如何點(diǎn)擊 Login.aspx 中的登錄按鈕Btn_Login將用戶名與密碼提交給 LoginTransfer.aspx ,并執(zhí)行LoginTransfer.aspx 中的Btn_Login_Click 事件。 private void Btn_Login_Click(object sender, System.EventArgs e) { string from = Request["FromUrl"];??? //起始 URL 路徑 string next = this.allLoginUrl;? //由于控件 ID 相同,所以此處得到的是由 Login.aspx 提交過來的用戶名與密碼 if(this.Txt_LoginName.Text=="Admin"&&this.Txt_Password.Text=="123456") { System.Web.Security.FormsAuthenticationTicket tk = new System.Web.Security.FormsAuthenticationTicket(1,"Admin", System.DateTime.Now, System.DateTime.Now.AddYears(100),false,"測試用戶數(shù)據(jù)"?); string key = System.Web.Security.FormsAuthentication.Encrypt(tk); //得到加密后的身份驗(yàn)證票字串 string url = next.Split(';')[0]; //從URL 中拆分出將要跳轉(zhuǎn)的下一張頁面 next = next.Replace(url+";",""); //帶入下一輪跳轉(zhuǎn)的字串 Response.Redirect(url+"?CookieTicket="+key+"&FromUrl="+from+"&NextUrl="+next); //跳至下一頁面 }??????? } 5、?第二種思路——后羿射日 后羿射日,意思指的是用戶點(diǎn)哪就跳哪。他若是點(diǎn)“火坑”,你也得往里跳,因?yàn)橛脩羰巧系勐铩N覀冊(cè)黾右粋€(gè)通行證頁面 MyPassport.aspx ,由 http://127.0.0.1/FormTest/Public/LoginTransfer.aspx 發(fā)放驗(yàn)證 Cookie 后直接跳轉(zhuǎn)至 http://127.0.0.1/FormTest/MyPassport.aspx 。不要告訴我你不會(huì),你要是真不會(huì),那偶也沒法子啦,還得請(qǐng)你回頭看看,偶在第三篇是如何講述發(fā)放永久性驗(yàn)證 Cookie 吧(http://blog.csdn.net/cityhunter172/archive/2005/12/06/545301.aspx)。還需要一張用作跳板的跳轉(zhuǎn)頁面 MyTransfer.aspx 。 MyPassport.aspx 的代碼: <a target ="_blank" href="MyTransfer.aspx?goto=http://localhost/FormTest/Public/AddCookie_D.aspx"> 美麗的天使</a> <a target ="_blank" href="MyTransfer.aspx?goto=http://127.0.0.1/FormTest/Public/AddCookie_E.aspx"> 快樂的天堂</a> <atarget ="_blank" href="MyTransfer.aspx?goto=http://My_Computer_Name/FormTest/Public/AddCookie_F.aspx"> 大大的火坑</a> MyTransfer.aspx 的代碼: private void Page_Load(object sender, System.EventArgs e) { //獲取身份驗(yàn)證票 System.Web.Security.FormsAuthenticationTicket tk =((System.Web.Security.FormsIdentity)User.Identity).Ticket; string key = System.Web.Security.FormsAuthentication.Encrypt(tk); //每次加密后的字串都是不同的 string next = Request["goto"]; //將要跳轉(zhuǎn)的URL Response.Redirect(url+"?CookieTicket="+key); //跳轉(zhuǎn)至下一頁面 } AddCookie_D.aspx、AddCookie_E.aspx、AddCookie_F.aspx 這三張頁面的代碼: string key = Request["CookieTicket"]; //已加密的 Cookie 文本 if(key != null && key !="") { System.Web.HttpCookie ck = new HttpCookie(System.Web.Security.FormsAuthentication.FormsCookieName,key); ck.Path=System.Web.Security.FormsAuthentication.FormsCookiePath; ck.Expires = System.DateTime.Now.AddYears(100); Response.Cookies.Add(ck); //將傳過來的已加密的身份驗(yàn)證票添加至客房端 Response.Redirect("../Index.aspx"); //跳轉(zhuǎn)至你真正想帶客戶去的地方 } 6、?點(diǎn)評(píng) 兩者共同點(diǎn): a). 每個(gè)站點(diǎn)都需要一個(gè)登錄的提交點(diǎn)、一張?zhí)砑?Cookie 的頁面。 b). 因?yàn)橹荒芸堪l(fā)放驗(yàn)證 Cookie 來識(shí)別身份,所以一臺(tái)電腦不能同時(shí)登錄兩個(gè)帳號(hào)。 c). 都存在不同程度的安全隱患。 兩者不同點(diǎn):(天女散花以下簡稱“開女”,后羿射日就簡稱“后羿”) a). 天女一次性發(fā)放 Cookie ,如果站點(diǎn)較多,處理起來還是需要一些時(shí)間的。而后羿則相反,站點(diǎn)再多也不怕。 b). 天女在散花的過程中,如果中途被卡住,則需要一個(gè)錯(cuò)誤處理機(jī)制做回退處理。后羿則不需要。 c). 天女在登錄后可以直接在 IE 地址瀏覽其想看的站點(diǎn);而后羿則必須從通行證的跳板頁面進(jìn)入才行。 根據(jù)上述問題,給幾點(diǎn)建議: a). 不要使用永久性 Cookie ,應(yīng)指明身份驗(yàn)證票的過期時(shí)間,注意不是 Cookie 的有效期。 b). 在身份驗(yàn)證票的 UserData 中加入其它的驗(yàn)證信息或存放用戶 ID c). 在網(wǎng)絡(luò)通暢的情況下,比如局域網(wǎng),站點(diǎn)又相對(duì)較少,建議選用天女。50 個(gè)站點(diǎn)之間做跳轉(zhuǎn)應(yīng)該不會(huì)超過 10 秒(前提是已編譯好了,且不是初次訪問)。 三、??????? 跨域名、跨服務(wù)器的退出方法 只要理解了“天女散花”,退出就比較容易啦。為每個(gè)站點(diǎn)準(zhǔn)備一個(gè)用于退出的頁面,如下: a). http://localhost/FormTest/Public/Logout.aspx b). http://127.0.0.1/FormTest/Public/Logout.aspx c). http://My_Computer_Name/Public/FormTest/Logout.aspx private void Page_Load(object sender, System.EventArgs e) { System.Web.Security.FormsAuthentication.SignOut();//刪除 Cookie 中的身份驗(yàn)證票 string from = Request["FromUrl"]; string next = Request["NextUrl"]; string url = next.Split(';')[0]; next = next.Replace(url+";",""); if(url!="") { Response.Redirect(url+"?FromUrl="+from+"&NextUrl="+next); } else { Response.Redirect(from); } } 對(duì)啦,還有一張 LogoutTransfer.aspx. ,代碼偶就不寫,大家自個(gè)完成吧。
轉(zhuǎn)載于:https://www.cnblogs.com/yssoft/articles/1457867.html
總結(jié)
以上是生活随笔為你收集整理的ASP.NET 安全认证(四)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 真格量化——做空波动率策略
- 下一篇: WinDBG 技巧:如何生成Dump 文