该场景如下。我开始一个MVC应用程序的实例来调试它。该应用程序使用简单的会员资格,并在此运行期间登录。然后我回到VS改变一些东西并再次启动实例。这不是经常发生,但有时在这一刻,会员开始表演奇怪。在应用程序启动时,会调用[Authorize]
属性(确切地说属性在控制器上)后面的某些操作。但是,由于WebSecurity.CurrentUserId
等于-1,因此操作失败(相关操作仅根据WebSecurity.CurrentUserId
加载一些用户信息)。服务器重启后,MVC应用卡住了错误
如果我在浏览器中清除cookie,一切都很好,但我不能指望用户在遇到问题时也这样做。
我的同事向我解释它(可能)是因为我的本地IIS决定重新启动并且一些会话cookie变得无效,但是如果这可能发生在本地IIS实例上,是不是也有可能发生在远程服务器上?
其他重要的事实是,失败的操作被我们编写的自定义过滤器调用(更像是重定向到的)。此过滤器适用于所有操作(但不影响提到的那个)。这个过滤器可以让MVC忽略[Authorize]
属性吗?
我对这个应该可以工作的问题有一个肮脏的解决方法(用这个特定的应用程序),但我宁愿防止问题出现在第一个地方。
我认为这与this有关。基本上,当服务器重置时,身份验证Cookie就会消失。他们会马上重新创建,除非我的应用程序在页面重新加载之前无法访问它们(就像登录一样)。
我部分解决了上面描述的问题(重定向是在路上执行的),所以应用程序不再卡住。但是,如果有人在服务器重新启动期间登录,并且他尝试在此之后再执行帖子,他的帖子将不起作用,他将被重定向到与帖子操作同名的获取操作(我们的自定义过滤器是为此负责)。不幸的是,我无法修复过滤器,因为我需要用户ID和过滤器被调用的位置,它仍然是-1。
为什么会话数据与授权有关?在ASP.NET Request的生活中,授权发生在session_start之前。 – Larry
@Larry从我所了解的用户数据(如WebSecurity.CurrentUserId)生活在会话数据。我的问题是,用户在重新启动后保持授权,但我甚至无法得到他的id(它等于-1),应用程序崩溃并继续这样做,直到我清除浏览器中该网站的所有cookie。 – jahu