2

所以,这个问题很简单,尽管我开始怀疑这是否会得到回答......

我有一个网站,我想用推荐的 ViewStateUserKey 来保护我的视图状态。

在我的基本页面(显然从 Page 继承)我有这个代码:

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);

        if (User.Identity.IsAuthenticated)
            base.ViewStateUserKey = Session.SessionID;
    }

在 localhost 上运行良好,但是,当我将其上传到主机(由我们的本地提供商之一提供的共享主机)时,它会在我进行身份验证后给出传统的“视图状态 MAC 验证失败”错误。如果我将此代码注释掉,它会完美运行,所以我 1000% 确定这是原因。

在共享主机上执行视图状态安全的最佳方法是什么?我也已经设置了 ViewStateMac="Enabled"。是否足够或推荐的解决方法是什么?

4

1 回答 1

1

从在本地主机上播放而不是在服务器上播放的那一刻起,在我看来,您的会话存在一些问题,并且 sessionID 在您的服务器上快速更改/过期,比身份验证过期更快。

出于这个原因,从用户看到页面到发布页面,会话已过期或在身份验证更改之前发生更改,因此 sessionID 是不同的,因此您会收到此错误。

其他认为你可以看的是你已经设置了machineKeyweb.config。

更新

将您的代码与您做出不同的 Scott 进行比较。Scott 使用用户名,根本不会改变,而您使用 sessionid,就像我说的那样可以改变。

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

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

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

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

现在,如果您使用 cookie 在 vi​​ewstateuserkey 上设置它们,那么对于所有不允许 cookie 的用户,并尝试发布任何帖子都会出错。所以想一个这样的解决方案来处理它们

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

于 2012-06-02T12:50:06.633 回答