未在MVC3中授权时仍在执行操作

时间:2012-05-31 12:24:39

标签: c# asp.net-mvc-3

我有一个MVC3应用程序,用户需要先进行身份验证才能访问该站点。我登录并在显示数据的屏幕上,然后我离开了。一小时后我回来了,到现在用户已经自动注销了。但是,当我点击一个按钮获取数据,而没有重新登录时,我得到了死亡的黄色屏幕,因为我的对象为空。这是我的行动:

  [Authorize]
    public ActionResult Index(string id)

我认为[Authorize]属性确保不会执行此操作,除非它们经过身份验证,但显然它没有或我没有正确使用它。那么我如何使用[授权]或任何其他属性来确保用户始终经过身份验证,如果不是,请将他们带到登录屏幕?感谢

P.S。这仅在发生超时时发生。如果我只是尝试通过键入URL而不登录来访问视图,我会按预期获得登录屏幕

1 个答案:

答案 0 :(得分:4)

  

一小时后我回来了,现在用户已经自动注销

如果执行操作,则表示用户未注销。 [Authorize]属性按预期工作。

我怀疑您的问题与身份验证无关。它与您正在使用的ASP.NET Session有关。请记住,Forms Authentication cookie和ASP.NET Session是两个完全不同的概念。因此,我猜您在用户登录时已将某些内容存储到ASP.NET会话中。默认情况下,ASP.NET会话默认在20分钟后到期,并且独立于窗体身份验证cookie超时进行配置。因此,虽然用户身份验证cookie仍然有效并且用户已通过身份验证,但由于会话已过期或Web服务器只是回收您的应用程序而且您存储到会话中的所有内容当然都丢失了,因此会丢失其会话。

这就是说让我们看看你必须解决这个问题的不同可能性:

  1. 我推荐的方法是摆脱会话。只需将<sessionState mode="Off" />放在web.config中,忘记ASP.NET Session在无状态应用程序中引入的状态。
  2. 编写自定义Authorize属性,除了检查身份验证cookie是否有效外,还会检查Session是否仍包含值:

    public class MyAuthorizeAttribute : AuthorizeAttribute
    {
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            var authorized = base.AuthorizeCore(httpContext);
            if (!authorized)
            {
                return false;
            }
    
            return httpContext.Session["someKeyThatYouHaveStored"] != null;
        }
    }
    
  3. 然后使用此自定义属性:

    [MyAuthorize]
    public ActionResult Index(string id)