ASP.NET MVC3 - 反CSRF和会话超时

时间:2012-10-03 10:17:06

标签: asp.net-mvc-3 csrf

我正在实施Anti-Forgery框架,如下所述:

http://weblogs.asp.net/srkirkland/archive/2010/04/14/guarding-against-csrf-attacks-in-asp-net-mvc2.aspx

另外,为了最大限度地减少编码工作,我在客户端处理了 form.onsumit ajaxsend 事件的令牌插入部分。一切正常 - 直到会议结束。

在我的应用程序中,当用户会话超时时,我会显示一个弹出窗口,用户可以在此处重新登录并继续而不刷新当前页面,以便正在进行的工作是安全的。但这与反CSRF逻辑不相符。当用户在超时会话后尝试重新登录时,这会引发CSRF异常,因为cookie(__RequestVerificationToken_Lw__)已经过期,并且所有未来的POST都将无效,直到下一页刷新。

有没有办法将Cookie结束时间设置为未来日期而不是“会话”?我尝试编辑 Response.Cookie ,但这使得cookie无效。

任何帮助将不胜感激。 感谢

1 个答案:

答案 0 :(得分:1)

在用户会话结束时(显示弹出窗口时),您可以在服务器端设置httpcookie到期时间。

我从microsofts反伪造令牌实现中提取了一些代码。

internal static string GetAntiForgeryTokenName(string appPath)
        {
            if (string.IsNullOrEmpty(appPath))
            {
                return "__RequestVerificationToken";
            }
            return "__RequestVerificationToken_" + Base64EncodeForCookieName(appPath);
        }

    private static string Base64EncodeForCookieName(string s)
    {
        byte[] bytes = Encoding.UTF8.GetBytes(s);
        string text = Convert.ToBase64String(bytes);
        return text.Replace('+', '.').Replace('/', '-').Replace('=', '_');
    }

在代码中设置服务器端的cookie。

string antiForgeryTokenName = GetAntiForgeryTokenName(HttpContext.Request.ApplicationPath);
            HttpCookie httpCookie = HttpContext.Request.Cookies[antiForgeryTokenName];

            HttpCookie httpCookie2 = new HttpCookie(antiForgeryTokenName, httpCookie.Value)
            {
                HttpOnly = true
                //// your domain Domain = , 
                //// path Path = , 
                //// set path Expires = 
            };

            HttpContext.Response.Cookies.Set(httpCookie2);

请注意,我还没有测试过这段代码,如果您没有其他选择,请试一试。