1、 新建一個測試項目 javascript
新建一個測試項目,包含三張頁面(Default.aspx、Login.aspx、UserInfo.aspx)。 java
2、 修改 Web.config 程序員
一、把<authentication mode="Windows" /> 改爲: web
<authentication mode="Forms"> <forms loginUrl="Login.aspx" name=".ASPXAUTH"></forms> </authentication>
二、把<authorization> <allow users="*" /></authorization>改爲 : 數據庫
<authorization> <deny users="?"></deny> </authorization>
3、 編寫 .cs 代碼——登陸與退出 c#
一、 登陸代碼: api
private void Btn_Login_Click(object sender, System.EventArgs e) { if(this.Txt_UserName.Text=="Admin" && this.Txt_Password.Text=="123456") { System.Web.Security.FormsAuthentication.RedirectFromLoginPage(this.Txt_UserName.Text,false); } }
private void Btn_Login_Click(object sender, System.EventArgs e) { if(this.Txt_UserName.Text=="Admin" && this.Txt_Password.Text=="123456") { System.Web.Security.FormsAuthentication.SetAuthCookie(this.Txt_UserName.Text,false); Response.Redirect("Default.aspx"); } }
以上兩種均可發放驗證後的 Cookie ,即經過驗證,區別: 數組
a) 指驗證後返回請求頁面,俗稱「從哪來就打哪去」。好比:用戶沒登陸前直接在 IE 地址欄輸入 http://localhost/FormTest/UserInfo.aspx ,那麼該用戶將看到的是 Login.aspx?ReturnUrl=UserInfo.aspx ,輸入用戶名與密碼登陸成功後,系統將根據「ReturnUrl」的值,返回相應的頁面 瀏覽器
b) 則是分兩步走:經過驗證後就直接發放 Cookie ,跳轉頁面將由程序員自行指定,此方法多用於 Default.aspx 使用框架結構的系統。 安全
二、 退出代碼:
private void Btn_LogOut_Click(object sender, System.EventArgs e) { System.Web.Security.FormsAuthentication.SignOut(); }
4、 如何判斷驗證與否及獲取驗證後的用戶信息
有的時候,在同一張頁面須要判斷用戶是否已經登陸,而後再呈現不一樣的佈局。有人喜歡用 Session 來判斷,我不反對此類作法,在此我只是想告訴你們還有一種方法,且看下面代碼:
if(User.Identity.IsAuthenticated) { //你已經過驗證,知道該怎麼作了吧? }
User.Identity 還有兩個屬性AuthenticationType(驗證類型)與 Name(用戶名稱) ,你們要注意的是 Name 屬性,此處的User.Identity.Name將獲得,驗證經過(RedirectFromLoginPage 或SetAuthCookie)時,咱們帶入的第一個參數 this.Txt_UserName.Text 。這個參數很重要,關係到種種狀況.
5、 Web.config 的做用範圍
新建項目時, VS.Net 會在項目根目錄創建一個內容固定的 Web.config。除了在項目根目錄,你還能夠在任一目錄下創建 Web.config,條件就是應用程序級別的節點只能在根目錄的 Web.config 中出現。至於哪些是應用程序級別節點呢,這個問題嘛,其實我也不太清楚,呵呵。電腦不是我發明的,微軟不是我建立的,C# 更不是我說了算的,神仙也有不知道的,因此我不曉得是正常的。話雖如此,只要它不報錯,那就是對的。
關於 Web.config 設置的做用範圍,記住如下兩點:
一、 Web.config 的設置將做用於所在目錄的全部文件及其子目錄下的全部東東(繼承:子隨父姓)
二、 子目錄下的 Web.config 設置將覆蓋由父目錄繼承下來的設置(覆蓋:縣官不如現管)
給你們提個問題:有沒有比根目錄Web.config 的做用範圍還大的配置文件呢?看完第三部分便知分曉。
6、 學會拒絕與巧用容許
回到咱們在第一回合新建的測試項目「FormTest」 , 既然要進行驗證,按國際慣例,就得有用戶名與密碼。那,這些用戶是管理員本身在數據庫建好呢,仍是用戶註冊、管理員審覈好呢。只要不是通常的笨蛋,都知道 選擇後者。大家還別說,我公司還真有個別項目是管理員連到數據庫去建賬號的,屬於比較特殊的笨蛋,我們不學他也罷,仍是老老實實添加兩個頁面吧——註冊頁 面(Register.aspx)與審覈頁面(Auditing.aspx)。
問題終於就要浮出水面啦,當你作好 Register.aspx 時,想訪問它的時候忽然以爲不對勁,怎麼又回到了登陸頁面?你仔細瞧瞧網址,是否是成了:Login.aspx?ReturnUrl=Register.aspx 。怎麼辦,用戶就是由於沒有賬號纔去訪問註冊頁面的呀?(這句純屬廢話,有賬號誰還跑去註冊。)我時常對個人同事說:「辦法是人想出來滴!!」
一、 新建一個目錄 Public ,用於存放一些公用的文件,如萬年曆、腳本呀……
二、 在「解決方案資源管理器」中右擊點擊目錄 Public ,新增一個 Web.config
三、 把上述 Web.config 的內容通通刪除,僅留如下便可:
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.web> <authorization><allow users="*"/></authorization> </system.web> </configuration>
切入正題了。根據「覆蓋」原則,咱們知道上述 Web.config 將替代根目錄 Web.config 中的 <authorization> 節點設置,即:
<allow users="*"/> 替換 <deny users="?"></deny>
註解:「allow」容許的意思;「*」表示全部用戶;
「deny」 拒絕的意思;「?」表示匿名用戶;
所以,處於 Public 目錄下的文件,容許全部人瀏覽,包括未驗證的用戶。把 Register.aspx 拖進來吧,不再會有人阻止你瀏覽啦。
除了註冊頁面,咱們還提到一個審覈頁面(Auditing.aspx),審覈權限通常都在管理員或主管手裏,並不想讓其餘人瀏覽此頁面,怎麼辦?「
新建一個管理員的目錄 ManageSys ,在此目錄下再新增一個 Web.config。內容以下:
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.web> <authorization> <allow users="Admin"/> <deny users="*"/> </authorization> </system.web> </configuration>
如今的問題就是怎麼才能知道誰是「Admin」呢,你們還記得我在第一部分的結尾嗎?
System.Web.Security.FormsAuthentication.SetAuthCookie(this.Txt_UserName.Text,false); //經過驗證,發放 Cookie
以前我曾強調,要注意,第一個參數很重要,重要到什麼程度?說到這,恐怕地球人都知道了——它就是allow與deny的依據。假如此處用戶填寫的是「Admin」即 this.Txt_UserName.Text = "Admin"; 那麼進入系統後,他就能訪問 ManageSys 目錄下的網頁了,其它閒雜人等一概拒之門外。
7、 分散與集中
到目前爲此,咱們的測試項目「FormTest」已經擁有兩個目錄三個 Web.config ,伴隨用戶需求的多樣化,Web.config 也會愈來愈多,好比經常使用的文件上傳功能等等。衆多的 Web.config 分佈在不一樣的目錄裏面,維護起來確定比較煩人。
要想集中管理,不得不用到 <location> 節點與 path 屬性。在本項目中,咱們將目錄 Public 與 ManageSys 下的設置放在根目錄下的 Web.config 裏面,以下:
<?xml version="1.0" encoding="utf-8"?> <configuration> <location path ="Public"> <system.web> <authorization> <allow users="*"/> </authorization> </system.web> </location> <location path ="ManageSys"> <system.web> <authorization> <allow users="Admin"/> <deny users="*"/> </authorization> </system.web> </location> <system.web> <!-- 這裏放置原來根目錄 Web.config 的內容,就不列出來了 --> </system.web> </configuration>
須要提醒的是
一、 <location> 節點的位置是在 <configuration> 的一個子節點,它與原有的 <system.web> 屬於並列關係
二、 <location> 節點只須要放入對應子目錄 Web.config 中的 <system.web> 的節點內容
8、 額外的保護
細心的人可能早就發現 ASP.NET 的安全認證只針對 .aspx、.ascx …… 等 ASP.NET 文件起做用,而對普通頁面與文件卻「視而不見」,如 .htm、.js 、.jpg 等。經過如下步驟你就能夠保護你想保護的文件類型。
一、 打開 Internet 信息服務(IIS)管理器 → 右擊本項目虛擬 → 屬性,以下圖
二、 點擊按鈕「配置」,出現以下對話框:
三、 雙擊 .aspx 的應用程序擴展 → 查看對話框內容,以下圖:
四、 複製「可執行文件」的全路徑名稱後 → 點擊「取消」返回上一層對話框 → 點擊按鈕「添加」
五、 粘貼剛纔複製的內容(個人系統裝在 D 盤,因此內容爲 D:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll ) → 填寫後綴名爲 .htm → 填寫動做限制爲「GET,HEAD,POST,DEBUG」(爲方便省事你可選所有)
六、 最後點擊「肯定」 → 往項目中添加 HtmlPage1.htm → 在 IE 瀏覽器的地址欄直接輸入http://localhost/FormTest/HtmlPage1.htm → 觀看測試效果
最後送你們一段 Web.config 設置。
<location path ="決戰紫禁城"> <system.web> <authorization> <allow users="葉孤城"/> <allow users="西門吹雪"/> <deny users="*"/> </authorization> </system.web> </location> <location path ="金鑾殿屋脊"> <system.web> <authorization> <allow users="腰繫緞帶之人"/> <deny users="*"/> </authorization> </system.web> </location>
Web.config 中的 <location> 節點的path 屬性能夠是一張具體頁面的相對 URL 路徑,以下:<location path="ManageSys/Auditing.aspx">
「比根目錄Web.config 的做用範圍還大的配置文件」,它就是藏匿在 Windows 系統目錄下,支配整個 .Net Framework 配置的Machine.config
9、 Machine.config
Machine.config位於操做系統目錄下的(注:C:\WINDOWS【或WINNT 】\Microsoft.NET\Framework\v1.1.4322【或 v1.0.3705 】\CONFIG),控制着「更上一層樓」的 .NET Framework 的本機配置。接下來簡要的講解一下它的內容,以及它與 Web.config 的關係。
從新命名爲「machine.xml」,用 IE 瀏覽器打開
Machine.config 與 Web.config 是啥關係?四個字 —— 父子關係。
一、 Machine.config 中的設置將做用於運行在本機的全部站點及其虛擬目錄,遇到子目錄將一直繼承下去。
二、 Web.config 中的設置將覆蓋由 Machine.config 中繼承下來的對應的節點設置
a、 Machine.config 中的 <system.web> 節點全部內容都能出如今項目根目錄下的 Web.config 中,也就是說能在 Web.config 中的內容已經在 Machine.config 中一一列出;
b、 其中 <system.web> 節點下的 <pages> 還能出如今頁面上,如: HTML 視圖下,在WebForm1.aspx 的第一行加上<pages>的節點內容validateRequest="false" (此句意思是不對WebForm1.aspx頁面文本框輸入的值,是否包含 「<」 「>」 等等具備危險性的代碼進行檢查,下一節將具體運用到)
<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="FromTest.WebForm1" validateRequest="false" %>
10、 單點登陸(Single Sign On)的前提條件
以前說了這麼多關於 Machine.config 的事,都是爲了實現單點登陸做鋪墊,那何爲單點登陸(Single Sign On)?從字面理解就是在一個地方登陸,一般運用於 ASP.NET 分佈式環境中(跨單個服務器上的多個應用程序或在網絡場中)的 Forms 身份驗證。打個比方,就比如如今 Sohu(搜狐) 與 Chinren(中國校友錄) 的作法,我在 Sohu 登陸之後就不須要在 Chinaren 登陸了。臺灣與香港又把 Single Sign On 稱之爲「單一登入」。
要想實現此功能,首要條件是須要一組用於加密與驗證加密的密鑰。它們位於 Machine.config 中,修改 <system.web> 節點下的 <machineKey> 節點屬性,以下:
<machineKey firstKey="172" copyrightKey="Cityhunter172" validationKey="AD117F2F286CDCB15A9D1D4535E16DB0248026939**AUTHOR**CITYHUNTER172****WEBSITE**172*MEIBU*COM****MAILTO**CITYHUNTER172@126*COM*****F2F286CDCB15A9D1D4535E16DB0248026939" secondKey="meibu" decryptionKey="3C89AE62AD117F2F286CDCB15A9D1D4535E16DB0248026939" validation="SHA1" thirdKey="com" />
一、 validationKey 爲用於驗證加密數據的密鑰。最小長度爲 40 個字符(20 字節),最大長度爲 128 個字符(64 字節)。
二、 decryptionKey 爲用於加密數據的密鑰。長度只有 16 個字符(8 字節)與 48 個字符(24 字節)兩種。
三、 validation 爲用數據驗證使用的加密類型。擁有「SHA1」「MD5」「3DES」三種方法
四、 大夥參照上述 <machineKey> 試着在WebForm1.aspx運行下列語句:
this.TextBox2.Text ="ht"+"tp"+"://"+firstKey+"."+secondKey +"."+thirdKey
你們在修改以前請先備份一下 Machine.config ,到時要是出錯可別怪我沒提醒你。以上密鑰並非胡亂得來的,接下來向你們介紹生成密鑰的方法。
咱們把上一節中提到的 WebForm1.aspx 拖入本項目的 Public 目錄下,再往頁面上拖入一個 TextMode=MultiLine 的TextBox3 與一個 Button 編寫按鈕事件與函數:
private void Button1_Click(object sender, System.EventArgs e) { string decStr = this.CreateKeyString(int.Parse(this.TextBox1.Text)); string valStr = this.CreateKeyString(int.Parse(this.TextBox2.Text)); this.TextBox3.Text=string.Format("<machineKey validationKey=\"{0}\" decryptionKey=\"{1}\" validation=\"SHA1\"/>",valStr,decStr); } /// <summary> /// 生成加密型強隨機 Key 值 /// </summary> /// <param name="i">Key 的有效長度: /// decryptionKey 的有效值爲 8 或 24; /// validationKay 的有效值爲 20 至 64 /// </param> private string CreateKeyString(int i) { System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider(); //加密隨機數生成器 byte[] bt = new byte[i]; rng.GetBytes(bt);//用加密型強隨機值序列填充字節數組 System.Text.StringBuilder str = new System.Text.StringBuilder(); for(int j= 0;j<i;j++) { str.Append(string.Format("{0:X2}",bt[j])); //轉換成大寫的十六進制文本 } return str.ToString(); }
每次點擊按鈕生成密鑰都不一樣,你們不妨多點幾回。切換至 HTML 視圖,到WebForm1.aspx 第一行把 validateRequest="false" 去掉,而後再多點幾回 Button1試試,看看會有什麼效果,嘿嘿………
11、 單點登陸(Single Sign On)的站點示例
將上述 TextBox3 產生的文本,覆蓋Machine.config 中的,如今你的機器已經具有了單點登陸的條件。大夥能夠再新建一個項目 FormTest2 ,從 FormTest2 登陸後直接輸入 FormTest 中的Default.aspx 的網址(http://localhost/FormTest/ Default.aspx),反之亦可。
下面結合實例講解:偶在山東每步科技網站申請了一個免費二級域名 172.meibu.com,並下載了每步的 4.0 版的動態域名解析客戶端。如今使用 ADSL 拔號上網,也就是說個人電腦已經成了 Web 服務器,同時支持 SQL Server 、Oracle 空間高達 200 G 想怎麼弄就怎麼弄,夠牛吧,嘿嘿。佈署上來的項目有環勝數碼網站、權限管理系統、IT 內部管理網,以上三個項目是偶一人全權開發的。所謂全權就是從數據庫存儲過程寫到 .cs 代碼再到 javascript ,最後到美工都是偶一手搞定的。^_^ 我把這三個不相干的項目作成了單點登陸的模式,加上整合站點的主頁面,共有四個地方能夠進行登陸。由於用戶 Table 的結構不一樣,所以只有一個入口能在進入後,在跳轉站點時不會出錯,那就是在整合頁面登陸。
如今我想把環勝數碼這個站點單獨脫離出來,而剩下的兩個站點繼續實現單點登陸,該怎麼作呢?或者是個人 ASP.NET 的空間是租的,服務商確定不可能讓我修改 Machine.config ,我又咋辦哩?「辦法是人想出來滴!!」,根據上述 Machine.config 與 Web.config 的關係,咱們能夠把 <machineKey> 節點放入項目根目錄下Web.config的 <system.web> 節點。以下:
一、 權限管理系統項目的 Web.config 用於 Form 認證的設置
<machineKey validationKey="AD117F2F286CDCB15A9D1D4535E16DB0248026939**AUTHOR**CITYHUNTER172****WEBSITE**172*MEIBU*COM****MAILTO**CITYHUNTER172@126*COM*****F2F286CDCB15A9D1D4535E16DB0248026939" decryptionKey="3C89AE62AD117F2F286CDCB15A9D1D4535E16DB0248026939" validation="SHA1" /> <authentication mode="Forms"> <forms loginUrl="Login.aspx" name="172.MEIBU.COM_WARRANT"> </forms> </authentication> <authorization><deny users="?"></deny></authorization>
二、 IT 內部管理網項目的 Web.config 用於 Form 認證的設置
<machineKey validationKey="AD117F2F286CDCB15A9D1D4535E16DB0248026939**AUTHOR**CITYHUNTER172****WEBSITE**172*MEIBU*COM****MAILTO**CITYHUNTER172@126*COM*****F2F286CDCB15A9D1D4535E16DB0248026939" decryptionKey="3C89AE62AD117F2F286CDCB15A9D1D4535E16DB0248026939" validation="SHA1" /> <authentication mode="Forms"> <forms loginUrl="Login.aspx" name="172.MEIBU.COM_IT"> </forms> </authentication> <authorization> <deny users="?"></deny> </authorization>
解釋:
a) 兩個項目Web.cinfig的<machineKey> 節點確保如下幾個字段徹底同樣:validationKey 、decryptionKey 、validation
b) 兩個項目的 Cookie 名稱必須相同,也就是 <forms> 中的 name 屬性,這裏咱們把它統一爲 name ="172.MEIBU.COM_PROJECT"
c) 注意區分大小寫
在整合的過程當中,我把遇到的問題向大夥說一下,以避免大家走一樣的路。
1) 首先應該是用戶管理的問題,把兩個項目的用戶整合在一塊兒,可不是一件容易的事,原則是新建一個新的 Table 只存放賬號與密碼,用帳號作關聯,編寫觸發器,作到 Table 之間的同步;
2) 不要期望兩個項目間用 Session 進行傳值,兩個應用程序的 Session 是沒法共享的。網上有人曾把類庫(編譯後的 .dll 文檔)放入同一個 bin 文件夾實現過 Session 共享,這樣的作法其實是把兩個項目變相合併成一個應用程序,不是咱們所想要的,理由很簡單:Sohu 與 Chinaren 的服務器分處兩地該怎麼辦?
3) 項目間的傳值,可用 Cookie 實現。咱們介紹了只要運行 System.Web.Security.FormsAuthentication.SetAuthCookie 方法便可實現登陸,單點登陸的實質就是含有身份驗證票的 Cookie 能在項目間共用。
接下來,有必要向你們介紹一下 Cookie 在 .Net 中的用法。
12、 Cookie 在 ASP.NET 中的用法
你們也許和我同樣,不多在 ASP.NET 中使用 Cookie ,傳參數呀,存變量呀,用的比較多的是 Session 或 ViewState 以及隱藏控件,有的乾脆用「 ? 」的請求方式。
一、 Cookie 存放的目錄
Cookie 是存放在客戶端的東東,放在「Temporary Internet Files」目錄,因此說存在安全性的問題。大夥可經過如下方式找到具體位置:打開控制面板 → Internet 選項 → 常規 → Internet 臨時文件 → 設置 → 便可看到「當前位置」,→ 點擊「查看文件」將直接打開該文件夾,你也能夠點擊「移動文件夾」變動它所在的位置。參照下圖
二、 Cookie 的有效期
二、 Cookie 的有效期
二、 Cookie 的有效期
從上圖咱們能夠清楚的看到每一個 Cookie 文檔的「截止期」(即爲有效期)。在有效期內,當登陸計算機的用戶 Administrator 再次訪問 172.meibu.com 時,那麼 IE 就會在請求頁面的同時,連同上述的名稱爲「Cookie:administrator@172.meibu.com」的Cookie文檔內容一塊兒發送給服務器。
若該文檔包含多個 Cookie 的值時,截止期則以最後的失效期爲準。
三、 Cookie 的類型
這裏咱們按有效期來分,分爲兩種:
a) 即時型
指的是關閉瀏覽器(全部瀏覽 172.meibu.com 的 IE)後,Cookie 便失效,此類 Cookie 不會在「Temporary Internet Files」目錄出現。其實它也有截止期的,爲「0001-01-01」
b) 持久型
就是已指定具體「截止期」的,可以在「Temporary Internet Files」目錄裏面找到的 Cookie
四、 Cookie 的內容
雙擊打開「Cookie:administrator@172.meibu.com」,咱們看到如下內容
上圖中,「■」是換行符,你如果要打破什麼鍋來問我究竟是怎麼知道的話。我卻是會很樂意的告訴你:這就是經驗!偶從學習 C# 那刻起,就拿第一個 Windows 程序 —— 記事本 來開刀,保存文檔時得來的經驗。
因此服務器讀出來的格式以下圖:
五、 在 ASP.NET 頁面發放 Cookie
發送上述 Cookie 的 .cs 代碼爲:
System.Web.HttpCookie ck = new HttpCookie("ckValue0");
ck["Author"] ="CityHunter";
ck.Expires = System.DateTime.Now.AddMinutes(10);//若不指定,則爲即時型 Cookie
//ck.Path="/FormTest/ManageSys"; //設置 Cookie 的虛擬路徑,注意必定要以「/」開頭,不然爲無效 Cookie ;請你們自行看一下它與在客房端的 Cookie 文檔「名稱」與 「Internet 地址」的關係
Response.Cookies.Add(ck);
ck = new HttpCookie("ckValue1"); //從新新建一個名爲 ckValue1 的 Cookie
ck.Expires = System.DateTime.Now.AddMinutes(20); //即刻起 20 分鐘後失效
ck["E_Mail"] ="cityhunter172@126.com"; //設置 ckValue1 中的 E_Mail 值
ck["PersonalWeb"] ="172.meibu.com";
Response.Cookies.Add(ck); //添加此 Cookie
六、 取回已發放 Cookie 的值
Response.Write(Request.Cookies["ckValue0"]["Author"]+"<br>");//用不着說明了吧
Response.Write(Request.Cookies["ckValue1"]["E_Mail"]+"<br>");
Response.Write(Request.Cookies["ckValue1"]["PersonalWeb"]);
很久沒有出做業啦(何出此言?),這第三篇呀,但是花了偶兩個星期的業餘時間調試、總結、撰寫哪,都說時光貴如金,不知我花的這些時間能換來多少銀子?換銀子,我看是沒期望啦,能獲得閣下的一句評論,偶也知足了。記住,你的評論就是偶繼續寫下去的動力。
做業:給 Cookie 賦於如下值,怎樣獲得它的正確值
ck["str1"] ="2222";
ck["str"] ="str0=11111&str1=223";
能夠確定的是Request.Cookies["ckValue1"]["str"] 得不到 「str0=11111&str1=223」這個字串,你們不妨試一下 Request.Cookies["ckValue1"]["str1"] 會獲得意想不到的字串喲。
提示:使用 Server.UrlEncode()與Server.UrlDecode()
十3、 發放永久性的驗證 Cookie
你們登陸 CSDN的時候是否留意到一個「2 周內不用再登陸」的複選框,它又是怎麼作到的呢?你們是否曾遇到過這樣的困惑:在執行System.Web.Security.FormsAuthentication.SetAuthCookie 時明明已指定createPersistentCookie 爲 true 爲什麼關閉瀏覽器仍不能直接訪問網站?下面咱們就這個問題給你們解釋一下,且介紹如何手工建立身份驗證票並加入 Cookie 中。
System.Web.Security.FormsAuthenticationTicket tk = new System.Web.Security.FormsAuthenticationTicket( 1, //指定版本號:可隨意指定 "Admin", //登陸用戶名:對應 Web.config 中 <allow users="Admin" … /> 的 users 屬性 System.DateTime.Now, //發佈時間 System.DateTime.Now.AddYears(100), //失效時間:100 年之後,夠永夠久了吧 false, //是否爲持久 Cookie:還沒有發現有何用,至少目前偶還不知,下面會有說明 "測試用戶數據"//用戶數據:可用 ((System.Web.Security.FormsIdentity)User.Identity).Ticket.UserData 獲取 ); string str = System.Web.Security.FormsAuthentication.Encrypt(tk);//加密身份驗票 //聲明一個 Cookie,名稱爲 Web.config 中 <forms name=".APSX" … /> 的 name 屬性,對應的值爲身份驗票加密後的字串 System.Web.HttpCookie ck = new HttpCookie(System.Web.Security.FormsAuthentication.FormsCookieName,str); //指定 Cookie 爲 Web.config 中 <forms path="/" … /> path 屬性,不指定則默認爲「/」 ck.Path=System.Web.Security.FormsAuthentication.FormsCookiePath; //此句很是重要,少了的話,就算此 Cookie 在身份驗票中指定爲持久性 Cookie ,也只是即時型的 Cookie 關閉瀏覽器後就失效;所以上面我說:我是真的還不知在身份驗票中指定爲持久性 Cookie 有何用。 ck.Expires = System.DateTime.Now.AddYears(100); Response.Cookies.Add(ck); //添加至客房端