0

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

  [Authorize]
    public ActionResult Index(string id)

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

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

4

1 回答 1

4

一个小时后我回来了,到现在用户已经自动下线了

如果执行该操作,这意味着用户没有注销。该[Authorize]属性按预期工作。

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

话虽如此,让我们看看您必须解决此问题的不同可能性:

  1. 我推荐的方法是摆脱 Session。只需放入<sessionState mode="Off" />您的 web.config 并忘记 ASP.NET 会话在无状态应用程序中引入的状态。
  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;
        }
    }
    

然后使用这个自定义属性:

[MyAuthorize]
public ActionResult Index(string id)
于 2012-05-31T12:26:49.657 回答