【发布时间】:2013-12-24 04:25:20
【问题描述】:
我修复了跨站点请求伪造 (CSRF)。在 masterpage 的 OnInit 方法中:
if (requestCookie != null && Utility.GuidTryParse(requestCookie.Value, out requestCookieGuidValue))
{
_antiXsrfTokenValue = requestCookie.Value;
Page.ViewStateUserKey = _antiXsrfTokenValue;
}
Page.PreLoad += master_Page_PreLoad;
在 master_Page_PreLoad 我验证
if ((string)ViewState[AntiXsrfTokenKey] != _antiXsrfTokenValue || (string)ViewState[AntiXsrfUserNameKey] != (Context.User.Identity.Name ?? String.Empty))
{
logCSRF.Info("Error CSRF " + CurrentSession.CurrentUser.user_id);
Response.Redirect(Constants.DefaultPage.LoginPage);
}
验证后我重置了 antiXsrfTokenValue 和 cookie 的值:
_antiXsrfTokenValue = Guid.NewGuid().ToString("N");
Response.Cookies[AntiXsrfTokenKey].Value = _antiXsrfTokenValue;
异常“viewstate MAC 验证失败。如果此应用程序由 Web Farm 或集群托管,请确保配置指定相同的 validationKey 和验证算法。不能在集群中使用 AutoGenerate。”
为什么会有这个扩展?解决?
谢谢你的帮助!
【问题讨论】:
-
验证成功后为什么要重置token?令牌旨在长期存在。
-
我想更改每个操作的令牌值。
-
但是为什么呢?你到底想解决什么问题?正如我之前提到的 - 这些令牌旨在长期存在,因此这可能不是实现您预期目标的最佳方式。如果您告诉我们您的总体情况是什么,我们或许可以提出更合适的行动方案。