5

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

我已经阅读了很多文章,并且正在考虑完全禁用 SessionState,我认为这将使应用程序更加健壮,并且会为我省去一些麻烦(我读过的所有内容都告诉我,在农场不是微不足道的)。

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

对此最好的方法是什么?有没有推荐的书/文章你可以指点我,这样我就可以清楚了吗?

非常感谢你的帮助

4

3 回答 3

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

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

于 2010-09-16T05:24:11.423 回答
3

如果您的应用程序支持某些工作流,并且您希望通过应用程序回收(集群节点故障)持续存在,那么您可能可以完全忽略持久会话的复杂性。

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

例如,与其在 Session 中存储结帐对象树(项目列表、订单等),不如将其持久化到数据库本身。这样,“部分完成的结帐”不仅可以在节点故障或应用程序回收中幸存下来,而且如果该用户不得不去厨房扑灭紧急火灾或他们的 Windows 更新使他们的 PC 崩溃,他们可以在下次登录时恢复. :D 并且:你避免了所有复杂的分布式会话管理的东西。呸!

我知道这个答案比问题实际突出的身份验证点更进一步,但很高兴知道这一点,而且集群/农场环境肯定会出现在 aspnet 应用程序上。

Hanselman 关于集群 mvc 应用程序:http ://www.hanselman.com/blog/LoadBalancingAndASPNET.aspx

于 2010-09-16T05:53:45.143 回答
2

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

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

在没有启用 SessionState 的情况下会中断的是 MVC 的 TempData——它将内容存储在页面之间的会话中。但是,如果你只是避免使用它,你就是金子。

于 2010-09-16T15:45:12.920 回答