【问题标题】:Storing Check Box Selection in Cookies在 Cookie 中存储复选框选择
【发布时间】:2015-09-01 18:25:26
【问题描述】:

我已经编写了一个记住我的复选框,如果选中该复选框,则将用户名和密码存储在 cookie 中。我的问题是,如果他们检查它然后重新启动应用程序,用户名和密码会自动填充,但复选框不会保持选中状态。

我还没有想出办法来做到这一点......

我将在下面发布我的代码:

 if (!IsPostBack)
        {
            if (Request.Cookies["UserName"] != null && Request.Cookies["Password"] != null)
            {
                userNameTxtBox.Text = Request.Cookies["UserName"].Value;
                passwordTxtBox.Attributes["value"] = Request.Cookies["Password"].Value;
            }
        }


if (chkBoxRememberMe.Checked)
   {
      Response.Cookies["UserName"].Expires = DateTime.Now.AddDays(30);
      Response.Cookies["Password"].Expires = DateTime.Now.AddDays(30);
   }

else
{
      Response.Cookies["UserName"].Expires = DateTime.Now.AddDays(-1);
      Response.Cookies["Password"].Expires = DateTime.Now.AddDays(-1);

}
Response.Cookies["UserName"].Value = myUserName

string passwordEncrypted = Crypto.Sha256(myPassword);
Response.Cookies["Password"].Value = passwordEncrypted;

上面的代码可以正常工作。但是我有一个记住我的复选框,如果它被选中,我想将它保存到 cookie 中并保持选中状态,直到用户取消选中它....

有什么想法吗?

【问题讨论】:

  • 你做错了。您不应将密码以纯文本形式存储在 cookie 中。这非常容易受到攻击。您的应用程序应该在他们进入页面时(通过存储在 cookie 中的某种加密令牌)识别该人并自动登录。

标签: c# asp.net cookies


【解决方案1】:

您所做的事情不仅在安全性方面非常很糟糕,而且还在重新发明轮子。

ASP.Net 已经支持开箱即用的表单身份验证、默认成员资格提供程序、正确加密/散列的身份验证 cookie,甚至还支持 logon controla remember me checkbox

您可以使用如下标记将控件添加到您的 ASP.Net 登录页面:

<asp:Login ID="LoginControl1" runat="server" CreateUserUrl="Register.aspx" 
 VisibleWhenLoggedIn="False" TextLayout="TextOnTop" RememberMeSet="True">

(我们已将 DisplayRememberMe 属性设置为 true。这指示登录控件显示“下次记住我”复选框,并指示成员资格提供程序在成功登录后将持久身份验证 cookie 发送到用户的浏览器。 )

在您开始尝试之前,您可能应该阅读"Walkthrough: Creating a Web Site with Membership and User Login" on MSDN

【讨论】:

    【解决方案2】:

    如果在 cookie 存在的任何时候都应该默认选中复选框,那么我想你可以在这里设置它的选中状态:

    if (Request.Cookies["UserName"] != null && Request.Cookies["Password"] != null)
    {
        userNameTxtBox.Text = Request.Cookies["UserName"].Value;
        passwordTxtBox.Attributes["value"] = Request.Cookies["Password"].Value;
        chkBoxRememberMe.Checked = true; // <-- here
    }
    

    请注意,您可能在这里忽略了几个问题...

    1. 如果您在 cookie 存在时始终默认选中该复选框,则您不会为用户提供任何方式取消选中该复选框。用户需要从浏览器中手动删除 cookie,这不是很好的用户体验。 (更不用说许多用户不知道如何做到这一点。)
    2. 以纯文本形式存储用户密码非常不负责任。请立即停止这样做。相反,生成某种唯一令牌来识别用户并将该令牌存储在 cookie 中。然后,服务器端代码将根据与已知用户关联的已知令牌验证令牌。永远不要,永远将用户密码以纯文本形式存储在任何地方。

    【讨论】:

    • 像我在编辑中那样加密密码怎么样?
    • @codeBoy:一开始不写密码怎么办?任何时候用户的密码需要存储在服务器端,都应该使用单向哈希(这与加密相同)。一般规则是,任何人,甚至您作为系统管理员,都不应该永远能够读取原始密码。加密的东西可以解密,所以这还不够好。但即使是散列,你也不应该将它存储在客户端机器上。它有效地破坏了首先对其进行散列的目的。只存储一个令牌,而不是密码。
    • 没有必要这样做,codeBoy,因为 ASP.NET 将为您完成所有这些以及更多工作。您只需投入少量时间来设置 ASP.Net Membership,然后您就可以骑在 Microsoft 工程师的肩膀上,他们已经完成了以安全且安全的方式实现这些东西的工作。相当直观的方式。有关如何在不重新发明轮子的情况下执行此操作的一些信息和指向 MSDN 文档的链接,请参阅我的答案。
    猜你喜欢
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 2012-06-29
    • 2015-02-22
    • 1970-01-01
    • 2017-07-20
    相关资源
    最近更新 更多