【原创】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应用(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 林海雪原作者是谁啊?
- 下一篇: html frameset