0

我在logon.aspx.cs代码隐藏中创建了一些 cookie,该 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
    }  

这段代码的问题在哪里?

4

2 回答 2

1

这看起来不是一种非常安全的方法来保护对您的应用程序的访问。尝试查看ASP.NET 成员资格

否则尝试设置到期日期。此外,如本例所示,您可能希望将上述所有信息存储在一个 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);

此外,来自 MSDN

默认情况下,cookie 由同一域中的所有页面共享,但您可以通过设置其 Path 属性将 cookie 限制在网站中的特定子文件夹中。要允许应用程序的所有文件夹中的所有页面检索 cookie,请从应用程序根文件夹中的页面设置它,并且不要设置 Path 属性。如果您没有为 cookie 指定过期限制,则 cookie 不会持久保存到客户端计算机,并且会在用户会话过期时过期。Cookie 只能存储 String 类型的值。您必须先将任何非字符串值转换为字符串,然后才能将它们存储在 cookie 中。对于许多数据类型,调用 ToString 方法就足够了。有关更多信息,请参阅您希望保留的数据类型的 ToString 方法。

于 2013-06-03T10:58:25.767 回答
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

还要小心中间人攻击。以纯文本形式存储用户名和密码一开始并不是一个好主意。

于 2013-06-03T11:13:52.510 回答