MVC会话过期但不认证(MVC session expiring but not authentic

2019-07-31 08:45发布

我正在开发一个C#MVC应用程序,我似乎无法得到认证和会话超时同步。 我有一个基本的窗体身份验证设置和一些有限的会话值。 我设置了认证超时小于会话(28分钟比30),但对开发网络服务器上运行,该会议将在服务器重新启动被消灭而认证支左右。 我假设的验证被存储在明显生存的服务器重启的cookie。

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

我想我要强制认证超时如果会话为null,则然后强制登录。

难道这就是我真正想要做什么? 如果是如何以及在哪里办呢?

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

编辑

对于一个多角度的我还张贴了这个同一项目这样一个问题: 登录为...最佳做法?

Answer 1:

我发现我的答案。 重写授权属性。 这似乎是最优雅的方法:

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

        return base.AuthorizeCore(httpContext);
    }

}


Answer 2:

你可以用的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;
                }
            }
        }
    }

或者,你可以写一个HTTP模块和实施context_AuthenticateRequest ,以检查是否存在会话,并相应地处理请求。

希望帮助。

编辑由Valamas

见回答https://stackoverflow.com/a/1446575/511438与会话错误的帮助。



文章来源: MVC session expiring but not authentication