3

我正在实施防伪框架,如下所述:

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

另外,为了最大限度地减少编码工作,我在客户端处理form.onsmitajaxsend事件时做了令牌插入部分。一切正常——直到会话到期。

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

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

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

4

1 回答 1

1

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

我从微软的防伪令牌实现中提取了一些代码。

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);

请注意,我尚未测试此代码,如果您没有其他选择,请尝试一下。

于 2012-10-05T06:25:39.630 回答