我需要为用户存储一些与会话相关的数据。此数据不需要加密,但我想确保用户无法修改它。我认为我的选择是将其存储到隐藏字段中,将其存储到cookie中,或将其存储在ASP.Net会话状态中。我需要解决方案是服务器场安全。
如果它存储在cookie或隐藏字段中,那么我需要一种方法来确保用户无法修改它。
您认为这种数据的最佳方法是什么?
答案 0 :(得分:5)
第一个问题我问自己会话数据:我真的需要它们吗? 请记住,Web是无状态的,因此您可以重新设计应用程序以不使用会话状态。 会话需要大量的管理和服务器资源。
同时你有两个解决方案:
因为您在一个服务器场中将会话放在SQL Server上配置web.config中的会话状态(它需要资源并且速度稍慢但是最安全的方式来存储会话数据以确保用户无法修改它)
使用私人服务器密钥为您的cookie添加加密/解密机制
答案 1 :(得分:4)
用户始终可以修改Cookie,因为它是客户端存储。您需要存储数据服务器端。
对于您的问题,ASP.NET会话状态是可接受的解决方案,尽管有一些关于服务器场的警告。此MSDN article说明了如何使会话状态适用于您的服务器场环境。 Be.St。的答案涉及建议的进程外方法。
第三种方法是创建一个不一定依赖于Session状态的数据库驱动的会话存储。我发现会话状态对于不同的部署环境(例如服务器群)来说有点麻烦,所以我有时会使用这种方法。然后,您可以通过将会话密钥附加到查询字符串或将会话密钥存储在cookie中来访问此数据(仍可能由用户修改,但不太可能成为此类操作的目标)。
答案 2 :(得分:2)
就个人而言,我认为最好将信息存储在cache
中,尽管您可以很好地将其存储在session
中或对其进行加密并将其存储在cookie
中。只是个人偏好的问题
我更喜欢cache
的原因是它不容易受到会话劫持的影响,因此用户无法修改它,因为它存储在服务器上(与session
相同)方面)。
我问了一个关于使用自定义主体的问题,我在其中包含了很多可能对您有帮助的代码。
用于在缓存中存储额外用户信息的代码: Is this Custom Principal in Base Controller ASP.NET MVC 3 terribly inefficient?
编辑:我之所以喜欢将这些信息存储在近在咫尺的原因是我不想一直抓到数据库,因为这样做非常低效
答案 3 :(得分:1)
如果您需要使用服务器场并希望在节点之间共享会话状态而不必返回数据库,那么您始终可以使用AppFabric Session Provider。设置它有一点学习曲线,但它可以完成工作并且速度很快(不要在与应用程序相同的盒子上运行它)。