4

我想知道在 MVC 中处理和实现会话超时的最佳方法。我已经设置了我的应用程序,以便在用户进行身份验证时它可以处理“RememberMe”。我还将一些变量存储在Context.Session["myvar"];

当我的会话已过期但我的身份验证 cookie 尚未过期时,我遇到了问题。

我的第一个想法是根据操作请求检查会话统计信息;但这似乎是很多代码。有没有一个检查会话状态的好地方?处理会话超时的其他方法是什么?我希望在会话超时时将用户重定向到登录页面。或者如果用户仍然登录,则重新加载会话变量。

4

2 回答 2

11

有没有检查会话状态一次的好地方

当然,自定义 Authorize 属性看起来是个好地方:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var authroized = base.AuthorizeCore(httpContext);
        if (!authroized)
        {
            // the user is not authenticated or the forms authentication
            // cookie has expired
            return false;
        }

        // Now check the session:
        var myvar = httpContext.Session["myvar"];
        if (myvar == null)
        {
            // the session has expired
            return false;
        }

        return true;
    }
}
于 2012-05-08T15:26:11.360 回答
3

在 global.asax.cs 中,您可以添加 SessionStart 处理程序

protected void Session_Start(object sender, EventArgs e)
{
    if (this.Context.User != null && this.Context.User.Identity != null
        && this.Context.User.Identity.IsAuthenticated)
    {
        // Got user from authentication cookie (remember me).

        // here you can either re-instantiate user in your application/session
        // so he/she will be logged-in automatically (which is remember me functionality)
        // The username is in this.Context.User.Identity.Name

        // Or redirect user to login page if you need manual login
    }
}
于 2012-05-08T15:42:07.530 回答