ASP.NET 安全認證

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

方法a:
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); 
     } 
}
方法b:
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); //添加至客房端
相關文章
相關標籤/搜索