c# - ViewStateUserKey + 共享主机 + ViewStateMac 验证失败

标签 c# asp.net security viewstate shared-hosting

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

我有一个网站,我想在其中使用推荐的 ViewStateUserKey 来保护我的 View 状态。

在我的基本页面(显然是从 Page 继承的)中,我有以下代码:

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

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

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

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

最佳答案

从在本地主机上播放而不是在服务器上播放的那一刻起,在我看来你的 session 有一些问题,并且 sessionID 在你的服务器上变化/过期很快,比身份验证过期更快。

因此,从用户看到页面到发布页面, session 已过期或在身份验证更改之前发生更改,因此 session ID 不同,因此您会收到此错误。

其他人认为你可以看是你在 web.config 上设置了 machineKey

更新

将您的代码与您制作的不同的 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 将它们设置在 viewstateuserkey 上,那么对于所有不允许 cookie 的用户,并尝试发布任何帖子都会出错。所以想想这样的解决方案来处理它们

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

关于c# - ViewStateUserKey + 共享主机 + ViewStateMac 验证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10862258/

相关文章:

security - 解码嗅探到的数据包

c# - 如何使用 retry-after header 使用 asp.net http 客户端轮询 API

c# - Visual Studio在某些设计师身上崩溃

c# - 使用 VS2012 中的构建发布项目失败并显示 "Skipping unpublishable project"

c - Format String 漏洞困扰

asp.net - 我的事件日志充满了 ViewState 无效和未处理的异常

c# - 将参数传递给 ajax 上的 Web 服务

C#:这个基准测试类准确吗?

C# - 如何在 IQueryable 对象中搜索 Where Like %

c# - 启用分页时在 asp.ListView 中查找具有值的项目