ViewStateUserKey +共享主机+ ViewStateMacvalidation失败

所以,问题很简单,即使我开始怀疑这是否会得到回答……

我有一个网站,我想用推荐的ViewStateUserKey保护我的viewstate ..

在我的基页(显然inheritance自Page)我有这样的代码:

protected override void OnInit(EventArgs e) { base.OnInit(e); if (User.Identity.IsAuthenticated) base.ViewStateUserKey = Session.SessionID; } 

在localhost上运行良好,但是,当我将其上传到托管(由我们的本地提供商提供的共享托管)时,它在我进行身份validation后给出了传统的“viewstate MACvalidation失败”错误。 如果我对这段代码进行评论,那就完美了,所以我很确定这是原因。

在共享主机上执行viewstate安全性的最佳方法是什么? 我已经设置了ViewStateMac =“Enabled”。 是否足够或推荐的解决方法是什么?

从本地主机上而不是服务器上播放的那一刻起,我觉得你在会话中遇到了一些问题,而且sessionID在服务器上快速更改/过期,比身份validation过期更快。

由于这个原因,从用户看到页面到发布它,会话已经过期或在身份validation更改之前更改,因此sessionID是不同的,因此您得到此错误。

其他人认为你可以看一下你已经在web.config上设置了machineKey

更新

将您的代码与Scott做出不同的比较。 Scott使用的用户名完全没有变化,你使用的是sessionid,可以像我说的那样改变。

对我来说,以太使用Scott建议的,用户名,以及其他一些不会改变的值,例如用户的cookie,这并不是那么容易改变。

所以来自Scott http://www.hanselman.com/blog/ViewStateUserKeyMakesViewStateMoreTamperresistant.aspx

 void Page_Init (Object sender, EventArgs e) { if (User.Identity.IsAuthenticated) ViewStateUserKey = User.Identity.Name; } 

这就是斯科特检查用户是否经过身份validation的原因,因为得到了他的名字。 如果您使用sessionid或用户的cookie,则无需检查是否已通过身份validation。

现在,如果您使用cookie在viewstateuserkey上设置它们,那么对于所有用户而言,那个不允许cookie,并尝试发布任何post的用户将会收到错误。 所以想一个这样的解决方案来处理它们

https://stackoverflow.com/a/2551810/159270