1

我有一个关于在将应用程序移植到 MVC 时处理用户登录的问题:

  • 在“旧的”WebForm 时代,开发人员只需使用 SessionState 对象将用户设置为已登录,例如,只需将 userobject 放入 SessionState(并且此 userobject 包含简单的属性,例如 name/lastlogon/etc)。

  • 这些东西对我们来说效果很好,我已经看到很多应用程序都是这样做的

  • 是的,我知道有这个 MembershipProvide-thingy,但我从未使用过它

现在,在 MVC 中,每个人都告诉我“为此使用 SessionStat 很糟糕”和“以这种方式构建的应用程序在设计上存在缺陷”以及“存在大量安全风险”等等。

我使用了这种方法,因为它对应用程序非常可靠,实现起来很简单,并且涵盖了我们需要的所有东西。

(当然,回收网络工作者进程和清空会话是有问题的——但在我们的例子中这不是问题,因为该应用程序在专用机器上为每个国家/地区运行)

我已经阅读了教程,告诉我将这些东西放在数据库中,然后-注意-根据每个请求向数据库发出请求以检查用户是否已登录?但是:在任何情况下,这是一种可行的方式,因为我想将数据库请求保持在最低限度。

所以我的问题是:

A)在新的 MVC 应用程序中使用这种方式有什么问题?

B)在新建的 MVC 应用程序中处理这种情况的最佳方法是什么?

关于数据库中会话的想法:我不会这样做,而是设置一个额外的服务,比如通过网络获取查询的“会话管理器”,但是这样简单的请求不应该发送到数据库 - 是这不是个好主意吗?

任何想法,提示/等。非常感谢,因为这种情况真的让我很困惑:-X

4

1 回答 1

2

一个)

asp.net mvc 框架的一个基本原则是它的无状态。数据使用 http 请求传递并发送到视图模型中的视图。Web 表单尝试使用视图状态等来维护状态,这就是为什么您会在会话方法中看到登录用户的原因。这并不是说 session 不应该完全在 asp.net mvc 中使用,在某些情况下它可能有用。就像维护一个必须在最后一步坚持的 3 步表单流程。但通常我们已经有一个推荐的方式来处理用户登录,那就是表单身份验证

二)

要访问用户对象,您可以创建一个实现 IPrincipal 接口的自定义身份并添加所需的用户字段。然后在全局过滤器中设置自定义身份并在您的操作结果中访问它。关于不想为每个请求查询数据库,为什么不为初始请求调用它,然后缓存结果直到用户更新,然后您可以重新加载对象并再次将其设置为自定义身份。

于 2013-03-20T17:11:36.423 回答