我在logon.aspx.cs
代码隐藏中创建了一些cookie,以便读取并包含来自数据库的DB的用户信息。
HttpCookie UID = new HttpCookie("ID");
Response.Cookies["UID"].Value = Recordset[0].ToString();
Response.Cookies.Add(UID);
HttpCookie UName = new HttpCookie("Username");
Response.Cookies["Username"].Value = Recordset[3].ToString();
Response.Cookies.Add(UName);
HttpCookie Pass = new HttpCookie("Pass");
Response.Cookies["Pass"].Value = Recordset[4].ToString();
Response.Cookies.Add(Pass);
HttpCookie Admins = new HttpCookie("Admin");
Response.Cookies["Admin"].Value = Recordset[12].ToString();
Response.Cookies.Add(Admins);
HttpCookie Mails = new HttpCookie("Emails");
Response.Cookies["Emails"].Value = Recordset[9].ToString();
Response.Cookies.Add(Mails);
Response.Redirect("../default.aspx");
当我跟踪代码时,每件事情都很好并且数据由cookie保存 现在,当我在母版页或其他内容页面中阅读这些cookie时,我不能 在其他世界中,cookie不能通过其名称(或键)识别
if (Request.Cookies["Username"] !=null)
{
lblWelcomeUser.Text = Server.HtmlEncode(Request.Cookies["Username"].Value);
pnlUsersNavigation.Visible = true;
LoginMenu.Visible = false;
RegisterMenu.Visible = false;
lblWelcomeUser.Text = Server.HtmlEncode(Request.Cookies["Username"].Value);
//lblWelcomeUser.Text = Request.Cookies["Username"].Value.ToString();
if (Request.Cookies["Admin"].Value.ToString()=="True")
{
lblWelcomeUser.Text = "WELCOME ADMIN";
// Show Menu that is only for Admin
}
此代码中的问题在哪里?
答案 0 :(得分:1)
这看起来不像是一种安全的方式来保护对您的应用程序的访问。试着看ASP.NET membership。
否则尝试设置到期日期。此外,如此示例所示,您可能希望将所有上述信息存储在一个cookie中:
HttpCookie myCookie = new HttpCookie("UserSettings");
myCookie["UID"] = Recordset[0].ToString();
myCookie["Username"] = Recordset[3].ToString();
//...etc...
myCookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(myCookie);
另外,from MSDN:
默认情况下,Cookie由所有相同的页面共享 域,但您可以将cookie限制为网站中的特定子文件夹 通过设置其Path属性。允许通过检索cookie 应用程序的所有文件夹中的所有页面,从一个页面设置它 位于应用程序的根文件夹中,不设置路径 属性。如果您没有为cookie指定过期限制, cookie不会持久保存到客户端计算机,它会在到期时过期 用户会话到期。 Cookie只能存储类型的值 串。您必须先将任何非字符串值转换为字符串 可以将它们存储在cookie中。对于许多数据类型,调用ToString 方法就足够了。有关更多信息,请参阅ToString方法 对于您希望保留的数据类型。
答案 1 :(得分:1)
您可能会使用新的空cookie覆盖具有良好价值的Cookie。
// new cookie created - empty
HttpCookie UName = new HttpCookie("Username");
// new cookie created with a value
Response.Cookies["Username"].Value = Recordset[3].ToString();
// overwrite new cookie with value with new empty cookie
Response.Cookies.Add(UName);
创建cookie,设置值,然后将cookie添加到响应中。
HttpCookie UName = new HttpCookie("Username");
UName.Value = Recordset[3].ToString();
Response.Cookies.Add(UName);
另请注意,正如Paul Grimshaw所指出的,您可以在同一个Cookie中添加多个值。
下载Fiddler以检查请求/响应,以确保您的Cookie包含正确的值等... http://fiddler2.com/get-fiddler
还要小心Man-in-the-middle次攻击。用纯文本存储用户名和密码并不是一个好主意。