0

使用 ASP.NET MVC、实体框架、jQuery。我想让用户能够在点击“记住我”后自动登录,我想出的方法是:

  1. 当用户登录时
    • 如果用户登录并勾选“记住我”,则散列 PW 并存储在数据库中
    • 创建一个 cookie,使用加密的 UserID,然后是某种分隔符和散列的 PW。

然后下次用户回来时,我可以检查他们的 cookie,如果存在,我使用 AJAX 登录。如果用户注销,我当然会删除他们的 cookie。

这是完成自动登录功能的正确方法吗?

我猜我的散列函数和用户 ID 加密函数将在服务器端,为了创建 cookie,我将通过 AJAX 调用该函数,然后创建它。

这是最佳实践吗?

谢谢

4

2 回答 2

3

您的方法(具有指示用户已登录的值的 cookie)是相当标准的。

不标准的是存储经过哈希处理的用户名和密码(尤其是密码) -知道为什么需要这样做,并且由于 cookie 以明文形式传输(用于 http 连接),因此您向您的网站和用户之间的任何人提供能够查看密码哈希并有机会破解它以获得密码。

创建存储在 cookie 中的唯一“loggedIn”令牌(例如 GUID)而不是密码哈希 - 这是您比较以确定用户是否登录的内容。

于 2012-08-11T08:23:38.023 回答
1

许多可能的方法之一可能是:

注意:我已经用纯 PHP 对其进行了编码。但是所有语言的逻辑都是相同的。

  1. 设置 $redirect = FALSE。
  2. $_GET["logout"] 设置了吗?是,转3,否则转5
  3. 如果设置,删除,auth,rem_me cookies,销毁会话。
  4. 显示登录表单并退出。
  5. 这是发帖请求吗?如果是,转6,否则转18
  6. 设置 $redirect = TRUE。
  7. 是否提供了用户名和密码?是,转8,否则转3
  8. 从 db 获取 $username、$pass-hash 和 $rem-me-hash。
  9. $username & $password 和 DB 一样吗?是,转10,否则转3
  10. 设置 cookie["username"] = sanitized($_POST["username"])
  11. 发出一个包含 $auth = sha1(username.password.time.6random_letters) 的 cookie["auth"]。
  12. 设置会话["auth"] = sha1($auth)。取消设置 $auth。
  13. 是否选择了记住我选项?是,转13,否则转15
  14. 设置 $rem = sha1($user_string.$time.$password.$username.$random)
  15. 设置 cookie["rem"] = $rem
  16. 设置 $rem = 0
  17. 如果 $rem != $rem-me-hash_DB,则在 DB 中插入 $rem。前往 23
  18. $rem cookie 设置了吗?是的转到 19,否则转到 20
  19. $rem cookie == $rem-hash-in-db 吗?如果是,转至 22,否则转至 3
  20. $username-cookie && $auth-cookie &&auth-SESSION 设置了吗?如果是,转21,否则转3
  21. 是 sha1($auth-cookie) === $_SESSION["auth"] 吗?如果是,转22,否则转3
  22. $redirect == 是真的吗?如果是,则使用 301 GET 方法重定向回同一页面。否则转到 23
  23. 这是我的超级秘密星际迷航壁纸(内容)。

一个漫长的过程,但(希望)涵盖所有场景。

将所有这些算法保存在password.php要保护的每个文件的顶部,包括该文件。只有在经历了所有可能的场景后,才能对秘密内容进行控制。每次出现故障时,脚本都会显示登录表单并退出。

它还实现了 Post-Redirect-Get ( Wikipedia ) 方法,您可以在其中获取 POST 请求,对其进行处理,然后使用 GET 方法将用户重定向回来,以防止在 Back & Refresh 按钮按下时提交双重表单。

上述描述中可能存在拼写错误或混合概念。让我知道任何改进。

于 2012-08-11T09:23:29.910 回答