我无法在主页或其他页面中读取cookie

时间:2013-06-03 10:55:10

标签: asp.net cookies session-cookies httpcookie

我在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
    }  

此代码中的问题在哪里?

2 个答案:

答案 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次攻击。用纯文本存储用户名和密码并不是一个好主意。