【发布时间】:2014-07-07 16:14:08
【问题描述】:
场景如下。我启动了一个 MVC 应用程序实例来调试它。该应用程序使用简单的成员资格,我在此运行期间登录。然后我回到VS改变一些东西并再次启动实例。这种情况并不经常发生,但有时此时会员资格开始表现得很奇怪。当应用程序启动时,会调用 [Authorize] 属性(确切地说是控制器上的属性)后面的一些操作。但是该操作失败,因为WebSecurity.CurrentUserId 等于-1(有问题的操作只是根据WebSecurity.CurrentUserId 加载一些用户信息)。
如果我在浏览器中清除 cookie,一切都很好,但我不能指望用户在遇到问题时也会这样做。
我的同事向我解释说,它(可能)正在发生,因为我的本地 IIS 决定重新启动并且一些会话 cookie 变得无效,但如果这可能发生在 IIS 的本地实例上,那么它是否也可能发生在远程服务器?
另一个重要的事实是,失败的操作由我们编写的自定义过滤器调用(更像是重定向到)。此过滤器适用于所有操作(但不影响提及的操作)。这个过滤器可以让 MVC 忽略 [Authorize] 属性吗?
对于这个问题,我有一个肮脏的解决方法应该可以(使用这个特定的应用程序),但我更愿意首先防止问题出现。
我认为这与this 有关。基本上,当服务器重置身份验证cookie时就会死掉。它们会立即重新创建,除非我的应用在重新加载页面之前无法访问它们(就像登录一样)。
我部分解决了上述问题(在途中某处执行了重定向),因此应用程序不再卡住。但是,如果有人在服务器重新启动期间登录并且他尝试在此之后执行帖子,他的帖子将不起作用,并且他将被重定向到与帖子操作同名的获取操作(我们的自定义过滤器是对此负责)。不幸的是,我无法修复过滤器,因为我需要用户 ID,并且在调用过滤器时,它仍然是 -1。
【问题讨论】:
-
为什么会话数据与授权有关?在 ASP.NET Request 的生命周期中,授权发生在 session_start 之前。
-
@Larry 据我了解,用户数据(例如 WebSecurity.CurrentUserId)存在于会话数据中。我的问题是,用户在重新启动后仍然被授权,但我什至无法获得他的 id(它等于 -1),应用程序只是崩溃并一直这样做,直到我清除浏览器中该站点的所有 cookie。
标签: asp.net-mvc iis cookies simplemembership