日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【原创】Cookie应用(二)

發布時間:2023/11/27 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【原创】Cookie应用(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Cookie的作用很大,在很多技術方案中都有應用。它也是Forms身份認證模式所使用的一門技術點。

今天我就說一說它在Forms身份認證模式中都起到什么作用。

(一)理論知識

ASP.NET 使用身份驗證提供程序實現附加的身份驗證方案,這些身份驗證提供程序獨立于 IIS 身份驗證方案并且只用于 IIS 身份驗證方案之后。ASP.NET 支持下列身份驗證提供程序:

  • Windows(默認)
  • Forms
  • Passport
  • None

若要啟用 ASP.NET 應用程序的身份驗證提供程序,請使用 machine.config 或 Web.config 中的身份驗證元素,如下所示:

  • <system.web>   <!-- mode=[Windows|Forms|Passport|None] -->   <authentication mode="Windows" /></system.web>
    每個 ASP.NET 身份驗證提供程序都支持 OnAuthenticate 事件,該事件在身份驗證過程中發生,您可以使用該事件實現自定義的身份驗證方案。該事件的主要目的是將實現 IPrincipal 接口的自定義對象附加到上下文中

上面引用了MSDN中的定義。

二:Forms身份認證

Forms 身份驗證提供程序是一個身份驗證方案,它使應用程序可使用 HTML 窗體直接從客戶端收集憑據。客戶端直接向應用程序代碼提交憑據以進行身份驗證。如果應用程序驗證該客戶端的身份,則它向該客戶端發出一個 cookie,該客戶端在后面的請求中提交該 cookie。如果對于受保護資源的請求不包含該 cookie,則應用程序將該客戶端重定向到登錄頁。當驗證憑據時,應用程序可以用多種方法存儲憑據,如配置文件或 SQL Server 數據庫。有關更多信息,請參見 Forms 身份驗證提供程序。

注意???ISAPI 服務器擴展僅處理那些它擁有其應用程序映射的資源。例如,ASP.NET ISAPI 服務器擴展僅擁有特定資源(如 .asax、ascx、.aspx、.asmx 和 .config 文件,這里只給出這幾個)的應用程序映射。默認情況下,ASP.NET ISAPI 服務器擴展以及隨后的 Forms 身份驗證提供程序不處理任何對非 ASP.NET 資源(如 .htm、.jpg 或 .gif 文件)的請求。

優點

  • 允許使用任意條件自定義身份驗證方案。
  • 可用于身份驗證或身份確認。
  • 不需要相應的 Windows 帳戶。

缺點

  • 受制于 cookie 生存期的重放攻擊,除非使用 SSL/TLS。
  • 僅適用于映射到 Aspnet_isapi.dll 的資源。

同樣引用MSDN,接下來就用具體代碼實現其功能。

(三)一步一步實現Form認證模式

第一步:配置

在Web.Config中配置如下?

<system.web>

??<authentication mode="Forms">
???? <forms cookieless="UseCookies" name="LoginCookieName" loginUrl="Login.aspx"></forms>??????
??</authentication>

?</system.web>

第二:設置登錄憑證

新建立頁面Login.aspx,代碼如下

前臺

 1      <table>
 2         <tr>
 3             <td>登錄名:</td>
 4             <td><asp:TextBox ID="txtName" runat="server"></asp:TextBox></td>
 5         </tr>
 6         <tr>
 7             <td>密碼</td>
 8             <td><asp:TextBox ID="TextBox1" runat="server"></asp:TextBox></td>
 9         </tr>
10          <tr>
11             <td colspan="2"><asp:Button ID="Button1" runat="server" Text="提 交" οnclick="Button1_Click" /></td>        
12         </tr>
13      </table>

后臺

 1  protected void Page_Load(object sender, EventArgs e)
 2         {
 3             if (!IsPostBack)
 4             {
 5                 if (Request.Cookies[FormsAuthentication.FormsCookieName] != null)
 6                     Response.Redirect("Test1.aspx");
 7             }
 8         }
 9 
10         protected void Button1_Click(object sender, EventArgs e)
11         {
12             FormsAuthentication.SetAuthCookie(txtName.Text, false);
13         }

創建一個測試頁Test1.aspx

 1 <form id="form1" runat="server">
 2     <div>
 3       用戶名:
 4       <asp:Label runat="server" ID="lblUserName"></asp:Label>
 5       已登錄
 6       
 7       <asp:Button runat="server" ID="btnLoginOut" Text="退 出" 
 8             οnclick="btnLoginOut_Click" />
 9     </div>
10     </form>

后臺

 1  protected void Page_Load(object sender, EventArgs e)
 2         {
 3             if (!IsPostBack)
 4             {
 5                 if (Request.Cookies[FormsAuthentication.FormsCookieName] == null)
 6                     Response.Redirect("Login.aspx");
 7                 else
 8                 {
 9                     lblUserName.Text = Request.Cookies[FormsAuthentication.FormsCookieName].Name.ToString();
10                 }
11             }
12         }
13 
14         protected void btnLoginOut_Click(object sender, EventArgs e)
15         {
16             FormsAuthentication.SignOut();
17         }

我們直接運行Login.aspx進行登錄,然后再運行Test1.aspx,顯示結果如下:

用戶名: LoginCookieName 已登錄

LoginCookieName正是我們在Web.Config中配置的name的值嗎。再利用firefox的自帶工具查看一下本頁的Cookie值

名稱  LoginCookieName

值   E446C4B9D24D0F623023D6563D64C64AC082A41D685F28CEE9AE4CEEDFD0FFEE0D845EEADEC13FC81F33CA7E4E6B28291E95273A813C2D216C67

34E4D752D0F2CAA5F4B11ACA9FC355765810AFF2B0AFAACCD7AAFD04DD669C0CB52112EC277BC9347B1F

主機  localhost

路徑   /

加密   否

到期  會話期間完即失效

結果確認Form認證模式,其實就是利用Cookie的機制實現的。

是否經過認證我們還可以下面的代碼來判斷

?if (Request.IsAuthenticated)
??????????????? {
??????????????????? Response.Redirect("Test1.aspx");
??????????????? }?

(四)同域下Cookie共享問題

有的時候往往會累到同域下共享Cookie的一系列問題,我總結一下基本出現的問題。

情況一:比如在主域登錄后,在二級域中不作為一個已驗證的用戶,相反也是如此。

例如:主域名www.test.com,二級域名pass.test.com,如果我們在www.test.com中輸入用戶名/密碼進行認證,認證成功后我們用代碼FormsAuthentication.SetAuthCookie來設置Cookie,Cookie的域名往往被認為是www.test.com,我們再訪問pass.test.com時,它的域名默認是pass.test.com,因為Cookie和domain(域名)是相關聯的,如果在請求中域名不一致,Cookie將被忽略因些,我們在設置Cookie時,請使用以下代碼:

?FormsAuthentication.SetAuthCookie(txtName.Text, false);
??????????? HttpCookie lcookie = Context.Response.Cookies[FormsAuthentication.FormsCookieName];
??????????? lcookie.Domain = ".test.com";
??????????? Response.Redirect(FormsAuthentication.GetRedirectUrl(txtName.Text, false));

情況二:主域和二級域不能同時注銷問題

根據情況一的解釋,我們同理可以推出,如何注銷了吧,代碼如下:

??????????? FormsAuthentication.SignOut();
??????????? HttpCookie lcookie2 = Context.Response.Cookies[FormsAuthentication.FormsCookieName];
??????????? lcookie2.Domain = ".test.com";
??????????? Response.Redirect("user.aspx");

(五) 自定義登錄

上面可能一起我們在使用FormsAuthentication.SetAuthCookie來實現Form認證,其實我們還有另一種方式。代碼如下

?

?

?

1 FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
2    2, "NewLog", DateTime.Now, DateTime.Now.Add(10d), false, string.Empty);
3   string str = FormsAuthentication.Encrypt(ticket);
4 
5 
6   HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, str);
7   Response.Cookies.Add(cookie);

?

其效果和FormsAuthentication.SetAuthCookie是一樣的。這樣寫可能更靈活。
還可以自定義一些用戶特定信息。這個我們將在下一章來講。

?

?

?

?轉載的請注原創地址,謝謝。

?

轉載于:https://www.cnblogs.com/yxhblog/archive/2012/06/18/2553828.html

總結

以上是生活随笔為你收集整理的【原创】Cookie应用(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。