会话到期和auth cookie剩余

时间:2012-07-10 18:45:10

标签: c# asp.net asp.net-mvc-3 session forms-authentication

我遇到的问题是我的会话即将到期,

Session["UserId"] = userId;

但是身份验证cookie仍然存在,因此[authorize]属性仍然允许用户导航系统,直到系统尝试读取会话变量和错误。空例外

在会话到期时,是否有任何关于如何使auth cookie消失的想法?我非常感谢任何见解,因为我是ASP.NET MVC 3的新手。

2 个答案:

答案 0 :(得分:2)

这是不好的做法,请参阅this link以获得更深入的解释。基本上,通过以任何人身份登录,然后获取其他会话密钥,您可以窃取该身份。

我建议您在auth cookie中嵌入用户的ID,请参阅主题this question。然后,如果您愿意,您只需将会话用作缓存,只需将会话ID与存储在身份验证cookie中的会话ID进行比较即可。例如,在global.asax中执行此操作,这样您就不必更改应用程序

答案 1 :(得分:0)

有很多方法可以做到这一点。这只是一个想法。

public class ControllerBase : Controller
{
    public ControllerBase()
        : base()
    {
        this.VerifySession();  
    }

    /// <summary>
    /// Indicates whether the session must be active and contain a valid customer.
    /// </summary>
    protected virtual bool RequiresActiveSession
    {
        get { return true; }
    }

    public void VerifySession()
    {
        if (this.RequiresActiveSession && Session["UserId"] == null)
        {
            Response.Redirect(Url.Action("LoginPage"));
        }
    }

}

public class HomeController : ControllerBase
{
    protected override bool RequiresActiveSession
    {
        get
        {
            return true;
        }
    }

    public ActionResult Index()
    {
        return View();
    }
}

基本上你有一个控制器基础来处理验证会话。并且从中继承的任何控制器都可以指定是否要验证会话。

OR

您可以创建一个自定义Action Filter,它允许您在执行控制器操作之前将控制器或操作归属并将代码挂钩到处理管道中。