单服务器环境中视图状态 MAC 的验证失败

Posted

技术标签:

【中文标题】单服务器环境中视图状态 MAC 的验证失败【英文标题】:Validation of viewstate MAC failed on Single Server Environment 【发布时间】:2019-10-26 17:42:23 【问题描述】:

最近将我们的 .net 4.0 Web 应用程序迁移到 .net 4.7.2。 设置开发环境,它不是一个网络农场场景。 机器密钥也不是自动生成的。 点击登录页面按钮上的“视图状态 MAC 验证失败”错误。 MAC 验证在 IE 和 Chrome 中总是失败,每天只有一两次。

Web.config:

<machineKey decryptionKey="F4B786E157C86740A610D....ghfghhgfh3F5C69,IsolateApps" validationKey="80DAFD9....3hgfhgfAC1CDD71B66820B664160337A4C6179C6C1480C8DA6EFD3C17D34B7BCE11A4ED8C02DD0F...3EC5556C4029084A8871,IsolateApps" validation="AES"/>

尝试了以下方法;

    删除了表单中的动作标签 在 web.config 中关闭了 macValidation 重新生成机器密钥 在应用程序池中将“虚拟内存限制”设置为 0,将“加载用户配置文件”设置为 true

但没有运气。

错误:

An unexpected error has occurred on this page and it has been logged. Please feel free to contact us with the information listed below:

GUID: feee9d30-5c42-4130-ad8b-174c14ba9dad

Machine Name Date URL 
ZZZ 12/Jun/2019 16:15:22 http://ZZZ:8080/UserManagement/Login.aspx 
-------------------------------------
Error Message : Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster. See http://go.microsoft.com/fwlink/?LinkID=314055 for more information.

Source : System.Web

Target Method: Void ThrowError(System.Exception, System.String, System.String, Boolean)

Stack Trace : at System.Web.UI.ViewStateException.ThrowError(Exception inner, String persistedState, String errorPageMessage, Boolean macValidationError) at System.Web.UI.ObjectStateFormatter.Deserialize(String inputString, Purpose purpose) at System.Web.UI.Util.DeserializeWithAssert(IStateFormatter2 formatter, String serializedState, Purpose purpose) at System.Web.UI.HiddenFieldPageStatePersister.Load() at System.Web.UI.Page.LoadPageStateFromPersistenceMedium() at System.Web.UI.Page.LoadAllState() at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

-------------------------------------
Error Message : Invalid viewstate. Client IP: nn.nmn.nn.nn Port: 56640 Referer: http://ZZZ:8080/UserManagement/Login.aspx Path: /UserManagement/Login.aspx User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729) ViewState: N9AFLjJRk5zRjomBHUnBhKTyeeYZgPslJ2437+N8XNzq3+7stdsP1XrS7CU94lXL8m7fvnx50FxdNnBBD2q4Z3HIwMhvup84vACt8nRedbvA/9iTx22OHG00rTvNu3jVRe5KHZXbZI6mK1EULS62LJ0N1eDYe+cZ9KdN80EeMiwvJSeSNKipb+JFPdLVoBtDRs3I7FOcNcEN5MSS6vriyquXN8x6xwRF8zkm4Q7g1KL827Nhu1DGwuF9rd2UYL923eMv5ChZmgnyLFZHoj+QvvMo73NfeTilhM8wuUvex0uCmR/oK4cdq3gUPdwxTPsCbWarFwOJr17nTwVeFFKrdudAZwIPVmvJWqCcBP3wWChSG/7gh0MQu+LOWJ80WL8IeM5CAT4cF8toDzsnHrsEoDuXwksB65Lz741ATcE2l8PUFwrMLnRCXEVKfv8Mz/ohGRuOih2fbM19RviuGvpjPc6Z+8nbh3OjFiAbj7vAvWXXV2cbxXpHUnH25RdiFBtkzQx6DJKGg4uRLDXYEBygOlPB4gk+hj3Ld8mKcnWap3WHj6GMibDdh9IbXEwMDDk6magEnPIrfClJM8YlWxd6mDShhxKJH1CQZvpC9KYMghzBt4KM/WtmGZ3fK9Aihtf9oX3W4HY45yAvSGsAMa27b74P8kY=

【问题讨论】:

【参考方案1】:

以下是 MAC 验证错误的原因:

1.如果您的应用程序在场中运行(多服务器环境)

分辨率:

在负载平衡器中启用关联

2.检查您的应用程序池使用哪个标识,如果 IIS 工作进程使用应用程序池标识,则可能会导致问题。

分辨率:

使用 aspnet_regiis 实用程序 创建显式元素

3.您的应用程序池设置为 LoadUserProfile=false

分辨率:

选择应用程序池->进入高级设置->设置LoadUserProfile=true

4.Page.ViewStateUserKey 属性值不正确

分辨率:

验证 ViewStateUserKey 是否设置正确

更详细的解决方法可以参考微软文章: Resolving view state message authentication code (MAC) errors

问候, 哈尔帕

【讨论】:

感谢 Japla Panchal 的宝贵意见。抱歉,我不能投票(没有足够的声誉) 已经尝试过第 2 点和第 3 点(第 1 点与单服务器环境无关) 第 4 点 - 是的,这节省了一天的时间。散列的 SessionId 被用作 Page OnInit 通风口上的 ViewStateUserKey,这在后续调用中变得无效,因此改用“User.Identity.Name”来解决问题。

以上是关于单服务器环境中视图状态 MAC 的验证失败的主要内容,如果未能解决你的问题,请参考以下文章

设置 ViewStateUserKey 给我一个“视图状态 MAC 验证失败”错误

form submit时将__VIEWSTATE和__VIEWSTATEGENERATOR一起post到另外的页面,出现验证视图状态 MAC 失败。

机器密钥不起作用 - viewstate mac 失败

c# .net4.0验证视图状态 MAC 失败!试过网上的webconfig 节点添加配置,在网页page添加属性均无效。

Viewstate MAC 验证失败 ASP.Net 2.0 SP2

服务器配置,负载均衡时需配置MachineKey