验证viewstate MAC失败和反XSRF问题

时间:2014-06-10 14:17:29

标签: asp.net

我知道这次发布了很多次,并提出了宝贵的建议和建议修复。但他们都没有帮助。 我们有一个电子商务网站,这是在线订购系统。我们的网站托管在带有.net framework 4.0的IIS 7.0上。(这是IIS上唯一运行的网站)。在我们的测试环境中,一切正常,我们部署了它。 现在,当用户尝试访问该站点时,我们正在获取MAC错误,或者如果他在站点中并浏览到其他页面,则用户将面临此错误。这是堆栈跟踪。 例外:viewstate MAC验证失败。如果此应用程序由Web场或群集托管,请确保配置指定相同的validationKey和验证算法。无法在群集中使用AutoGenerate。

Stack Trace: System.Web.HttpException

Stack Trace: 

at System.Web.UI.ViewStateException.ThrowError(Exception inner, String persistedState, String errorPageMessage, Boolean macValidationError) at System.Web.UI.ViewStateException.ThrowMacValidationError(Exception inner, String persistedState) at System.Web.UI.ObjectStateFormatter.Deserialize(String inputString, Purpose purpose) at System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter2.Deserialize(String serializedState, Purpose purpose) at System.Web.UI.Util.DeserializeWithAssert(IStateFormatter2 formatter, String serializedState, Purpose purpose) at System.Web.UI.HiddenFieldPageStatePersister.Load() at System.Web.UI.Page.LoadPageStateFromPersistenceMedium() at System.Web.UI.Page.LoadAllState() at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) at System.Web.UI.Page.ProcessRequest() at System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context) at System.Web.UI.Page.ProcessRequest(HttpContext context) at ASP.pages_usagereports_index_aspx.ProcessRequest(HttpContext context) at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

当我们在基页中实现修复CSRF问题的代码时,我们开始遇到此问题。     如果我们取出代码并与用户一起测试,我们就不会收到任何错误。     到目前为止,我们尝试过这些解决方     1)即使我们不是网络农场环境,也应用机器密钥到网站。     2)我们不希望将enableviewstate禁用为false,或者将viewstateencryption模式禁用为never,因为不希望这样做。我们甚至试过这个,但没有帮助。     3)我们尝试为base.viewstateuserkey分配不同的组合,例如userhostaddress和user Agent的组合,但它没有帮助。     4)我们在此链接中使用了Microsoft .net Web保护库     http://software-security.sans.org/developer-how-to/developer-guide-csrf     在此之后我们开始收到另一个错误

Inner Exception Type: System.InvalidOperationException

Inner Exception: Validation of Anti-XSRF token failed.
Inner Stack Trace: 
at System.Web.UI.Page.HandleError(Exception e) at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) at System.Web.UI.Page.ProcessRequest() at System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context) at System.Web.UI.Page.ProcessRequest(HttpContext context) at ASP.signin_aspx.ProcessRequest(HttpContext context) at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

现在我们遇到两个错误。 MAC错误和Anti XSRF错误。 搜索了这个错误,我看到了一些帖子,但我试过了。他们都没有帮助。 对此有任何建议都非常感谢。

提前致谢

1 个答案:

答案 0 :(得分:0)

ViewState的MAC是使用主页面中生成的ANtiXsrfTokenKey派生的。如果用户访问您的站点时没有令牌(禁用cookie或更改或删除cookie中的值),则页面将生成新令牌。然后发生的事情是,如果页面中有一个ViewState被回发,那么将使用新令牌检查MAC并且与旧令牌不匹配,这是您可以看到的第一个错误。

主页中的Xsrf检查有点令人困惑,但使用存储在cookie中的Xsrf令牌并将其与页面中存储的值相匹配。通常这些会匹配但如果另一个站点试图向您的站点发出非法请求,他们的站点将不会发送Xsrf cookie并且检查将失败。这是令人困惑的原因是,如果你有一个ViewState,这将在Xsrf检查之前失败。

Xsrf检查的另一个问题是它使用登录用户的名称作为检查的一部分。如果用户已登录,然后auth cookie被删除或过期,则此部分检查将失败,您将看到Xsrf失败,这会产生误导,真正的错误是“身份验证已过期导致Xsrf检查失败”

我已经多次重新使用Site.Master.cs中的函数来使这些错误更加清晰。

希望有所帮助。