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

本文关键字:执行 操作 授权 MVC3 | 更新日期: 2023-09-27 18:35:48

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

  [Authorize]
    public ActionResult Index(string id)

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

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

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

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

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

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

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

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

    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)