1

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

Session["UserId"] = userId;

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

会话到期时如何使 auth cookie 消失有什么想法吗?由于我是 ASP.NET MVC 3 的新手,因此我当然会很感激任何见解。

4

2 回答 2

2

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

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

于 2012-07-10T19:00:52.580 回答
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();
    }
}

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

或者

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

于 2012-07-10T18:56:19.510 回答