21

我使用 是TempData为了在使用RedirectToAction. 它工作正常,但我有一种唠叨的感觉,它可能不是正确的做法。我真的尽量避免使用 Session 数据,而且我读过它TempData使用 Session。使用安全吗?在负载平衡环境中使用它可能会出现问题吗?

琐事问题:“它安全吗?”——给电影命名。

4

5 回答 5

22

是的,TempData 由会话存储支持,因此如果您处于负载平衡环境中,则在使用它时必须格外小心(粘性会话、持久会话状态等)。

使用 PRG 模式时,TempData 是事实上的选择,也是它的设计目的。

至于这样做是否正确……这取决于您的用例!

PS马拉松人。

于 2011-11-23T14:18:35.213 回答
5

好吧,我认为这取决于。如果您使用负载平衡器和多个前端服务器处理大量流量,则应避免使用会话对象,因为它可能会降低性能并使热点扩展变得困难(场上的请求并不总是来自同一个 Web 服务器)。

TempData 是短暂的,如果你不在那里放置很多对象并三思而后行整个架构,我认为它是安全的。有很多网站广泛使用它并且没有任何问题(我在共享和专用托管网站上工作,平均每天有 50-70k 访问者使用会话,通常在同一台服务器上使用 web 和 db)。

于 2011-11-23T14:51:56.500 回答
2

只要有可能,我就会采用完全无国籍的方法。它更具可扩展性,并且不受单个服务器问题的影响。通常,您可以只使用 cookie(适当地防止篡改)来识别用户并每次从数据库中提取数据。

除此之外,我还建议您评估是否可以使用View代替RedirectToAction. 这个:

TempData["model"] = model;
return RedirectToAction("SomeAction");

可以替换为:

return View("SomeAction", model);

当然,假设“SomeAction”是一个可以从当前控制器访问的有效视图(它可以是同一 ctrl 中的视图或 Shared 中定义的视图),并且它不仅仅是重定向到另一个的中间操作。

于 2011-11-23T14:33:13.063 回答
2

会话状态可以在集群环境中工作,前提是发生以下两种情况之一

  1. 您的负载均衡器支持“粘性”会话(即给定会话中的所有请求都被路由到同一台机器)
  2. 您将会话提供程序配置为使用进程外会话提供程序,您可以使用ASP.NET 状态服务SQL 会话状态提供程序

是否应该使用 tempdata 是一个完全不同的问题。我认为通常有办法解决它。如果您试图避免对数据库的冲击以重新加载一个操作已经加载的对象,请考虑使用缓存。

于 2011-11-23T19:35:26.150 回答
1

我限制了使用 TempData 在视图和操作之间传递模型对象验证消息。我还没有从安全角度研究 Tempdata 的使用,但在 SO 线程讨论相同:HttpContext.Items with ASP.NET MVC。请参阅最后几个线程评论和相关讨论。

于 2011-11-23T14:23:09.377 回答