TempData:安全吗?

时间:2011-11-23 14:12:16

标签: asp.net-mvc tempdata

我使用TempData以便在使用RedirectToAction时保留我的模型。它工作正常,但我有一种唠叨的感觉,它可能不是正确的做法。我真的试图避免使用Session数据,并且我已经读过TempData使用Session。使用安全吗?在负载平衡环境中使用它可能会出现问题吗?

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

5 个答案:

答案 0 :(得分:22)

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

TempData在使用PRG模式时一直是事实上的选择,并且是它的设计目标。

至于是否正确的做法......这取决于你的用例!

PS马拉松男子。

答案 1 :(得分:5)

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

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

答案 2 :(得分:2)

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

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

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

可替换为:

return View("SomeAction", model);

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

答案 3 :(得分:2)

会话状态可以在群集环境中工作,前提是发生了两件事之一

  1. 您的负载均衡器支持"sticky" sessions(即给定会话中的所有请求都路由到同一台机器)
  2. 您将会话提供程序配置为使用进程外会话提供程序,您可以使用ASP.NET State ServiceSQL Session State Provider
  3. 是否应该使用tempdata的问题完全是一个不同的问题。我认为通常有办法绕过它。如果您试图避免命中数据库以重新加载已加载一个操作的对象,请查看使用缓存。

答案 4 :(得分:1)

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