问题
我们在多个项目中重复使用的堆栈中,将太多数据放入会话以在页面之间传递数据。从理论上讲,这很好,因为它可以防止篡改、重放攻击等问题,但实际上它带来的问题也同样多。
会话丢失本身就是一个问题,虽然通过实现会话状态服务器(或使用 SQL Server)可以大部分解决。更重要的是,使“后退”按钮正确工作比较棘手,而且还需要额外的工作来创建这样一种情况:用户可以在三个选项卡中打开相同的屏幕以处理不同的记录。
这只是冰山一角。
对于大多数这些问题都有解决方法,但当我努力解决这些问题时,所有这些摩擦力让我感到:使用会话在页面之间传递数据是错误的方向。
我真正想做的是制定一种最佳实践,使我的团队可以始终使用它来传递页面之间的数据,并为新应用程序替换当前依赖于会话的堆栈关键部分。
如果最终解决方案不需要大量的样板编程代码,那就更好了。
提出的解决方案
会话
如上所述,过度依赖会话看起来像是一个不错的主意,但它会破坏“后退”按钮并引起一些其他问题。
虽然可能有方法解决所有这些问题,但似乎需要额外的工作。
使用会话的一个非常好的地方在于,数据篡改不是问题。与通过未加密的查询字符串传递所有内容相比,你最终编写的防护代码要少得多。
跨页发布
实际上我几乎没有考虑过这个选项。我对其导致页面之间耦合过紧的方式有意见——如果我开始做 PreviousPage.FindControl("SomeTextBox"),如果我想从另一个可能没有名为 SomeTextBox 的控件的页面访问该页面,则此方法会造成维护问题。
看起来在其他方面也有限制。例如,我可能想通过链接进入页面。
查询字符串
目前我正在倾向于使用这种策略,就像古代一样。但是我可能希望我的查询字符串被加密以使它更难被篡改,并且我也想解决重放攻击的问题。
在Rolla的 4 个家伙网站上,有一篇文章讨论了这个问题。
然而,应该可以创建一个 HttpModule 来处理所有这些内容,并从页面中删除所有加密代码。的确,Mads Kristensen 发布了一篇文章,其中介绍了如何创建一个 HttpModule 来进行查询字符串加密。他的文章提供了详细信息。 然而,评论中表明它在极为常见的情况下存在问题。
其他选项
当然,这不是所有选项的详尽说明,而只是我正在考虑的主要选项。 这个链接 包含了一个更完整的列表。我没有提到的那些选项,如 Cookies 和缓存,不适合于在页面之间传递数据。
总结
那么,你是如何处理页面之间传递数据的问题的呢?你必须解决哪些隐藏的问题,并且是否有现成的工具可以完美地解决它们?你是否认为已经找到了一个完全令人满意的解决方案?
提前致谢!
更新: 为了避免我表述不够清晰,'传递页面间数据'指的是例如从 CustomerSearch.aspx 页面传递 CustomerID 键到 Customers.aspx 页面,在该页面中打开客户并进行编辑。