28

从页面到页面进行身份验证和跟踪用户身份验证状态的最佳方法是什么?有人说会话状态,有人说 cookie?

我可以只使用具有用户 ID 的会话变量,并在身份验证后,实例化一个包含用户信息的自定义用户类。然后,在每个页面上,验证会话变量是否仍然处于活动状态并从 User 对象访问基本用户数据?

有什么想法吗?有什么好的例子吗?

4

5 回答 5

25

为了“安全”而偏爱会话而不是 cookie 的问题是会话使用 cookie 来识别用户,因此会话存在任何关于 cookie 的问题。

使用 Sessions 时要记住的一件事是数据局部性。如果您计划在任何时候扩展到多个网络服务器,则需要非常小心地将大量数据存储在会话对象中。

由于您使用的是 .NET,因此您基本上必须编写自己的会话存储提供程序来处理这个问题,因为 InProc 不会扩展到超过 1 个服务器,数据库提供程序完全是一个坏主意(重点是要避免数据库读取这里边扩容,不加多),而且StateServer有很多容量问题。(过去,我曾使用过 memcached 会话存储提供程序并取得了一些成功来解决这个问题)。

我会在谷歌上搜索签名的 cookie,并考虑使用它而不是常规的 cookie 或会话。它解决了很多安全问题,并消除了会话的局部性问题。请记住,它们会根据每个请求来回返回,因此请谨慎存储数据。

于 2008-12-10T16:17:37.173 回答
17

没有完美的方法来做到这一点。如果您将其存储在 cookie 中,您会认为 cookie 可能会被盗。如果您将其存储在会话中,您将受到攻击,因为会话可能被劫持。

就个人而言,我倾向于认为会话更可靠一些,因为唯一存储在客户端上的是会话密钥。实际数据保留在服务器上。如果你愿意的话,它会在离胸部更近的地方打牌。然而,这只是我的偏好,一个好的黑客无论如何都能够通过伪劣的安全性。

无论您做什么,都不要尝试自己实现。你会弄错的。使用您的特定平台提供的身份验证系统。您还需要确保有足够的安全预防措施来保护身份验证令牌。

于 2008-12-10T16:04:08.540 回答
1

我不知道这是否是最好的方式,但我们对我们的方式感到满意。

我们有一个自定义用户对象,我们在用户进行身份验证时实例化它,然后我们使用 Session 在整个应用程序中维护这个对象。

在某些应用程序中,我们将其与 cookie 的使用结合起来以持续扩展会话。

于 2008-12-10T16:06:07.290 回答
0

Cookies 和 Sessions 本身还不够。它们是用于跟踪用户及其行为的工具,但您确实需要考虑使用数据库来保存有关用户的信息,这些信息也可用于保护应用程序。

于 2008-12-11T01:06:04.547 回答
-3

会话是 Cookie...

于 2009-03-10T15:43:02.137 回答