10

我正在开发一个 C# MVC 应用程序,我似乎无法让身份验证和会话超时同步。我有一个基本的表单身份验证设置和一些有限的会话值。我将身份验证超时设置为小于会话(28 分钟对 30 分钟),但针对开发 Web 服务器运行,会话将在服务器重新启动时被擦除,但身份验证仍然存在。我假设身份验证存储在一个显然在服务器重新启动后仍然存在的 cookie 中。

<authentication mode="Forms" >
  <forms loginUrl="~/Account/Login" timeout="28" />
</authentication>
<sessionState timeout="30" />

我想如果 Session 为空,我想强制身份验证超时,然后强制登录。

那是我真正想做的吗?如果是这样,我该如何以及在哪里执行此操作?

如果不是,那么处理此问题的正确方法是什么?

编辑

对于更多的观点,我还为同一个项目发布了这个问题:登录为...最佳实践?

4

2 回答 2

14

我找到了我的答案。覆盖授权属性。这似乎是最优雅的方法:

public class AuthorizeWithSessionAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (httpContext.Session == null || httpContext.Session["CurrentUser"] == null)
            return false;

        return base.AuthorizeCore(httpContext);
    }

}
于 2012-11-12T17:27:21.740 回答
6

您可以使用 PreRequestHandlerExecute 事件处理程序在 global.asax 中处理此问题

protected void Application_PreRequestHandlerExecute(object sender, EventArgs e)
    {
        //Check if user is authenticated
        HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
        if (authCookie != null)
        {
            FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
            if (!authTicket.Expired)
            {
                if (Session["XYZ"] == null)
                {
                    //Session is null, redirect to login page
                    FormsAuthentication.SignOut();
                    Response.Redirect(FormsAuthentication.LoginUrl, true);
                    return;
                }
            }
        }
    }

或者,您可以编写一个 Httpmodule 并实现context_AuthenticateRequest以检查会话是否存在并相应地处理请求。

希望有帮助。

瓦拉马斯编辑

有关会话错误的帮助,请参阅答案https://stackoverflow.com/a/1446575/511438 。

于 2012-09-05T04:28:21.023 回答