在不使用Session的情况下创建可扩展的ASP.Net MVC网站

时间:2010-09-16 05:03:06

标签: asp.net asp.net-mvc session web-farm

我正在使用Asp.Net MVC开发一个Web项目,我必须将其部署到一个农场环境。

我已经阅读了很多文章,我正在考虑完全禁用SessionState,我认为这会使应用程序更加强大,并且会让我感到头疼(我读过的所有内容都告诉我处理农场的会议并非无足轻重。)

有些事情我仍然没有完全清楚这种方法,主要是认证/授权过程。基本上我不知道如果服务器上没有启用SessionState,我可以如何(如果?)处理用户会话。 如果用户登录该网站然后尝试访问另一个页面,我怎么知道该用户已经登录? 我知道使用cookie是不安全的,我想到了混合的cookie和存储在数据库中的会话ID,但我想如果我禁用SessionState,我也无法访问会话ID。

最好的方法是什么?是否有任何推荐的书籍/文章可以指向我,所以我可以明白这一点?

非常感谢你的帮助

3 个答案:

答案 0 :(得分:6)

我认为使用表单身份验证,这将管理您登录的用户名,您也可以通过此设置授权。

http://msdn.microsoft.com/en-us/library/ff647070.aspx

http://msdn.microsoft.com/en-us/library/xdt4thhy.aspx

http://www.codeproject.com/KB/web-security/formsroleauth.aspx

http://www.beansoftware.com/ASP.NET-Tutorials/Forms-Authentication-Active-Directory.aspx

这些链接是您每个问题的答案。通过此,您可以管理角色授权和会话

答案 1 :(得分:3)

如果您的应用程序支持您希望保持应用程序回收(群集节点故障)的工作流,则可能会完全忽略持久的会话复杂性。

考虑电子商务结帐示例或类似的多步骤流程,在完成之前需要进行大量的状态管理。建议是设计应用程序的model是这样的,在这些“步骤”中,工作流的进度通过模型原生地保存到数据存储。也就是说,“workfolow”不是应用程序主模型的某种外部性,因此被视为“临时”事物,需要一些持久性机制,如aspnet Session而不是应用程序常规数据存储(数据库) 。

例如,不是在Session中存储结帐对象树(项目列表,订单等),而是将其保存到数据库本身。这样,“部分完成的结账”不仅可以在节点故障或应用程序回收中存活,而且如果该用户必须在厨房中发出紧急火灾或者他们的Windows Update崩溃他们的PC,他们可以在他们登录时恢复。 :d 并且:您避免了所有复杂的分布式会话管理。育!

我知道这个答案远远超出了问题实际突出的身份验证点,但这很好知道,并且群集/服务器场环境确实存在于aspnet应用程序上。

群集mvc应用上的Hanselman:http://www.hanselman.com/blog/LoadBalancingAndASPNET.aspx

答案 2 :(得分:2)

FormsAuthentication和ASP.NET用户配置文件在没有启用SessionState的情况下工作 - 它们默认运行在cookie和数据库查找上。

对于购物车类型的场景,我强烈考虑将数据保存在数据库中并标记用户 - 它可以让人们回来并抓住废弃的购物车。

如果没有启用SessionState,可以和将要破坏的是MVC的TempData - 它会在页面之间的会话中存储东西。但是,如果你只是避免使用它,你就是金色的。