我正在实施Anti-Forgery框架,如下所述:
另外,为了最大限度地减少编码工作,我在客户端处理了 form.onsumit 和 ajaxsend 事件的令牌插入部分。一切正常 - 直到会议结束。
在我的应用程序中,当用户会话超时时,我会显示一个弹出窗口,用户可以在此处重新登录并继续而不刷新当前页面,以便正在进行的工作是安全的。但这与反CSRF逻辑不相符。当用户在超时会话后尝试重新登录时,这会引发CSRF异常,因为cookie(__RequestVerificationToken_Lw__
)已经过期,并且所有未来的POST都将无效,直到下一页刷新。
有没有办法将Cookie结束时间设置为未来日期而不是“会话”?我尝试编辑 Response.Cookie ,但这使得cookie无效。
任何帮助将不胜感激。 感谢
答案 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);
请注意,我还没有测试过这段代码,如果您没有其他选择,请试一试。