【问题标题】:ASP.NET MVC3 - Anti-CSRF and Session timeoutASP.NET MVC3 - 反 CSRF 和会话超时
【发布时间】:2012-09-24 06:12:04
【问题描述】:

我正在实施此处所述的防伪框架:

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 无效。

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

【问题讨论】:

  • 你可以使用 jQuery 和 $.cookie("RequestVerificationToken_Lw", 1, { expires : 10 });这将使 cookie 在 1 天内过期(您可以自定义为不同的时间跨度)
  • 感谢@DarrenDavies 的回复。但这些 cookie 是 httponly 的,无法使用 javascript 访问。

标签: asp.net-mvc-3 csrf


【解决方案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);

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

【讨论】:

    猜你喜欢
    • 2011-09-01
    • 2012-04-08
    • 2010-12-05
    • 2011-04-12
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多