所以,问题很简单,即使我开始怀疑这是否会得到回答......
我有一个网站,我想用推荐的ViewStateUserKey保护我的视图状态。
在我的基页(显然是从Page继承)中我有这段代码:
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
if (User.Identity.IsAuthenticated)
base.ViewStateUserKey = Session.SessionID;
}
在localhost上运行良好,但是,当我将其上传到托管(由我们的本地提供商提供的共享托管)时,它在我进行身份验证后给出了传统的“验证viewstate MAC failed”错误。如果我对这段代码进行评论,那就完美了,所以我很确定这是原因。
在共享主机上执行viewstate安全性的最佳方法是什么?我已经设置了ViewStateMac =“Enabled”。是否足够或推荐的解决方法是什么?
答案 0 :(得分:1)
从本地主机上而不是服务器上播放的那一刻起,在我看来,您在会话中遇到了一些问题,并且sessionID在您的服务器上快速更改/过期,比身份验证过期更快。
由于这个原因,从用户看到页面到发布它,会话已经过期或在身份验证更改之前更改,因此sessionID是不同的,因此您会收到此错误。
其他人认为您可以看到您已在web.config上设置machineKey
。
将您的代码与您的代码进行比较。 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;
}
这就是斯科特检查用户是否经过身份验证的原因,因为得到了他的名字。如果您使用sessionid或用户的cookie,则无需检查是否已通过身份验证。
现在,如果您使用cookie在viewstateuserkey上设置它们,那么对于所有用户而言,那个不允许cookie,并尝试发布任何帖子的用户都会收到错误。所以想一个这样的解决方案来处理它们