【问题标题】:ViewStateUserKey + shared hosting + ViewStateMac validation failureViewStateUserKey + 共享主机 + ViewStateMac 验证失败
【发布时间】:2012-06-02 12:16:15
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    更新

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

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

    所以来自斯科特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

    【讨论】:

    • 这正是我的想法,我的会话 ID 已更改。但是,经过一些研究(在 chrome web 工具中检查),似乎情况并非如此。我的 web.config 中的 Machinkey 由该站点 aspnetresources.com/tools/machineKey 生成,并且它本身(没有 ViewStateUserKey)可以正常工作。
    • @walther sessionid 与用户的 cookie 相关联,但已更改并已过期。为什么不直接设置用户的cookie?其次,为什么要检查 IsAuthenticated 与否……没有理由只为经过身份验证的用户提供安全性。 (至少在我的代码上,我为所有用户使用 cookie)
    • @walther 记录下你的 sessionid 看看是否有变化。
    • 好吧,Scott Hanselman 在他的网站上有这段代码,所以我认为它会很好。最初我没有检查经过身份验证的用户,但也没有帮助。 hanselman.com/blog/…
    • 我会尝试记录会话 ID,我们会看到的。我会在进行更多研究后回复。
    猜你喜欢
    • 2022-11-25
    • 2020-07-15
    • 1970-01-01
    • 2021-12-25
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 2022-12-20
    相关资源
    最近更新 更多