1

当有人登录时,我会存储 cookie,如下所示:

List<User> listUser;
//returns 1 user
foreach(User u in listUser)
{
   HttpCookie cookieNickname = new HttpCookie("UserNickname");
   cookieNickname.Value = u.Nickname.ToString();
   cookieNickname.Expires = DateTime.MaxValue;
   Response.Cookies.Add(cookieNickname);

   HttpCookie cookiePassword = new HttpCookie("UserPassword");
   cookiePassword.Value = u.Password;
   cookiePassword.Expires = DateTime.MaxValue;
   Response.Cookies.Add(cookiePassword);
}

当有人再次访问该站点时,我想从与 usernickname-cookie 和 userpassword-cookie 关联的数据库中读取数据。

然后我想在标签上显示名字和姓氏。

这是我尝试过的:

List<User> cookieLoggedInUser;

if (Request.Cookies["UserNickname"] != null && Request.Cookies["UserPassword"] != null)
    {
        //returns 1 user
        cookieLoggedInUser = Database.SignIn(Request.Cookies["UserNickname"].ToString(), Request.Cookies["UserPassword"].ToString());

        if (cookieLoggedInUser.Count > 0)
        {
            foreach (User u in cookieLoggedInUser)
            {
                lblFirstName.Text = u.FirstName;
                lblLastName.Text = u.LastName;
            }
        }
    }

但是两个 Request.Cookies 都返回 null。

为什么会这样?

4

2 回答 2

1

我不推荐您出于实验目的而采用的方法,因为它具有很大的安全风险。

要使您当前的解决方案正常工作,请检查您是否在使用它们的同一域中创建 cookie。

如果不是这种情况,浏览器将不会向其他域发送 cookie。

于 2013-07-17T15:41:53.200 回答
0

您可以使用以下技术使登录 cookie 永久化:

protected void Login1_OnLoggedIn(object sender, EventArgs e)
{
    CheckBox Remember = (CheckBox)((Login)sender).FindControl("Remember");
    if (Remember.Checked)
    {
        FormsAuthenticationTicket t = new FormsAuthenticationTicket(2, Login1.UserName, DateTime.Now, DateTime.Now.AddYears(5), true, "");
        string data = FormsAuthentication.Encrypt(t);
        HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, data);
        authCookie.HttpOnly = true;
        authCookie.Domain = "";
        authCookie.Expires = t.Expiration;
        Response.Cookies.Remove("FORMAUTH");
        Response.Cookies.Add(authCookie);
        Response.Redirect(Request.QueryString["ReturnUrl"]);
    }
}

这假定该站点正在使用 asp.net 会员服务。

该行Response.Cookies.Remove("FORMAUTH");应与您在本节下的 web.config 中设置的 cookie 名称匹配:

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

将此连接到OnLoggedIn您的控件的事件,<asp:Login>当用户单击记住我时,他们会保持登录状态。

这比您建议的替代方案(在 cookie 中存储未加密的密码)安全得多。

于 2013-07-17T15:50:57.857 回答