读取cookie以自动登录

时间:2013-07-17 15:28:40

标签: c# asp.net cookies

我在有人登录时存储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。

为什么会这样?

2 个答案:

答案 0 :(得分:1)

我不建议您采用其他方法进行实验,因为它存在很大的安全风险。

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

如果不是这样,浏览器不会将cookie发送到其他域。

答案 1 :(得分: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中存储未加密的密码)更安全。