viewstate MAC的Asp.net验证失败

viewstate MAC的Asp.net验证失败,asp.net,viewstate,machinekey,Asp.net,Viewstate,Machinekey,我在asp.net网站上的某些时间收到以下错误 Sys.WebForms.PageRequestManagerServerErrorException: Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that <machineKey> configuration specifies the same validatio

我在asp.net网站上的某些时间收到以下错误

 Sys.WebForms.PageRequestManagerServerErrorException: 
 Validation of viewstate MAC failed. 
 If this application is hosted by a Web Farm or cluster,
 ensure that <machineKey> configuration specifies the 
 same validationKey and validation algorithm. 
 AutoGenerate cannot be used in a cluster.
Sys.WebForms.PageRequestManagerServerErrorException:
viewstate MAC验证失败。
如果此应用程序由Web场或群集托管,
确保配置指定了
相同的validationKey和验证算法。
无法在群集中使用自动生成。

页面刷新时,没有问题。如何解决此问题?

如果使用web场并在多台计算机上运行同一应用程序,则需要在machine.config文件中明确定义机器密钥:

<machineKey validationKey="JFDSGOIEURTJKTREKOIRUWTKLRJTKUROIUFLKSIOSUGOIFDS..." decryptionKey="KAJDFOIAUOILKER534095U43098435H43OI5098479854" validation="SHA1" />

把它放在
标签下

无法使用机器代码的自动生成。要生成自己的machineKey,请参阅以下powershell脚本:

将网站发布到服务器后,通常会显示此错误消息

主要问题在于您用于网站的应用程序池

在与您的网站相关的应用程序池的“常规”部分下,配置您的网站以使用正确的.NET Framework版本(即v4.0)

在流程模型下,将标识值设置为网络服务

关闭对话框,右键单击网站并选择高级设置。。。从内容菜单的管理网站选项。在对话框的“常规”部分下,确保选择了要使用的应用程序池的正确名称

你的网站现在应该运行没有任何问题


希望这有助于您克服此错误。

在多服务器环境中,当会话过期且应用程序的另一个实例使用相同的会话id和计算机密钥在不同的服务器上重新启动时,可能会发生此错误。首先,每台服务器都会生成自己的机器密钥,该密钥随后与应用程序的单个实例关联。当会话过期且当前服务器繁忙时,应用程序会像通过负载平衡器一样重定向到更易操作的服务器。在我的情况下,我从多个服务器运行相同的应用程序,错误消息:


viewstate MAC验证失败。如果此应用程序由 Web场或群集,请确保配置指定 相同的validationKey和验证算法

在web.config中定义下的机器代码可以解决此问题。 但不要使用第三方站点生成可能已损坏的代码,请从命令行运行此命令: 基于microsoft解决方案1a

您的密钥看起来像:

对于ASP.NET 2.0和3.5 你的钥匙看起来像:

什么对我有用

  • 在web上搜索“MachineKey生成器”

  • 转到找到的其中一个站点并生成机器密钥,看起来像。。。(数字更大)
    …MachineKey
    validationKey=“0EF6C03C11FC…63EAE6A00F0B6B35DD4B”decryptionKey=“2F5E2FD80991C629…3ACA674CD3B5F068” validation=“SHA1”decryption=“AES”/>

  • 复制并粘贴到web.config文件的
    部分

  • 如果你想走我走过的路



    解决视图状态消息身份验证代码(MAC)错误 解决方案3b:使用明确的

    通过向应用程序的Web.config文件添加显式的
    元素,开发人员告诉ASP.NET不要使用自动生成的加密密钥。有关如何生成
    元素的说明,请参见附录A



    生成MachineKey的最简单方法-Ahmet Mithat Bostanci-2012年7月31日 您可以在Bing中搜索“MachineKey generator”,并使用在线服务。老实说



    查看状态MAC验证失败。如果此应用程序由web场或群集托管,请确保
    配置指定了相同的validationKey和验证算法。无法在群集中使用自动生成

    答复:

    微软说

    和这里的其他人一样,我将此添加到我的
    web.config

    <System.Web>
        <machineKey decryptionKey="ABC123...SUPERLONGKEY...5432JFEI242" 
                    validationKey="XYZ234...SUPERLONGVALIDATIONKEY...FDA" 
                    validation="SHA1" />
    </system.web>
    
    
    
    但是,我使用IIS作为machineKey生成器,如下所示:

  • 打开IIS并选择网站以获取此屏幕:
  • 双击机器钥匙图标以获取此屏幕:
  • 点击右边的“生成密钥”链接,我在上面的图片中概述了这个链接
  • 注:

    • 如果选择“为每个应用程序生成唯一密钥” 复选框“、IsolateApps”将添加到密钥的末尾。我有 删除这些以使应用程序正常工作。显然,他们不是一部分 钥匙的钥匙
    • SHA1是IIS选择的默认加密方法,如果您更改了它,请不要忘记在web.config中更改machineKey上的验证属性。然而,加密方法和算法不断发展,所以请随意编辑 这篇文章介绍了最新的首选加密方法 在笔记里,我会更新的

    此解决方案在ASP.NET 4.5中使用Web表单网站对我有效

  • 使用以下站点生成机器密钥:
  • 复制完整的机器密钥代码
  • 转到Web.Config文件
  • 将机器钥匙粘贴到以下代码部分:
  • 
    

    您不应该再看到viewstate Mac failed错误。同一应用程序池中的每个网站都应该有一个单独的机器密钥,否则此错误将继续。

    我有此问题,对我来说,答案与此问题的其他答案不同

    我有一个有很多客户的申请。我在
    global.asax
    中捕获应用程序中的所有错误,并向自己发送一封包含错误详细信息的电子邮件。在我发布了新版本的应用程序之后,我开始收到很多viewstate MAC验证失败的错误消息

    经过一天的搜索,我意识到我的应用程序中有一个计时器,可以刷新更新面板
    Generate-MachineKey
    
    Generate-MachineKey -validation sha1
    
    <System.Web>
        <machineKey decryptionKey="ABC123...SUPERLONGKEY...5432JFEI242" 
                    validationKey="XYZ234...SUPERLONGVALIDATIONKEY...FDA" 
                    validation="SHA1" />
    </system.web>
    
        <configuration>
          <system.web>
            <machineKey ... />
          </system.web>
        </configuration> 
    
    aspnet_regiis -ga "IIS APPPOOL\My App Pool"
    
    enableViewStateMac="false"
    
    <base href="/" />
    
    $('input').each(function(ele, indx){
        this.value = this.value.toUpperCase();
    });
    
    $('input:visible').each(function(ele, indx){
        this.value = this.value.toUpperCase();
    });
    
    <httpCookies httpOnlyCookies="true" requireSSL="true"/>
    
    <system.web>
    <pages validateRequest="false" enableEventValidation="false" viewStateEncryptionMode ="Never" />
    </system.web>