负载均衡导致的视图状态消息验证代码错误

windows下.NET V4.0应用程序通过IIS8.0对外提供服务,最近迁移采用F5负载均衡,通过集群VIP访问出现视图状态 MAC 的验证失败错误提示,详细报错

windows-mac-error
根据错误提示信息可以很容易看到错误原因及如何解决,更详细的解决方案可参考官方的解决视图状态消息验证代码 (MAC) 错误
注意:针对不同版本的.net和IIS解决方法可能不尽相同。

错误原因

当不在config文件中指定machineKey元素,ASP.NET将为应用程序使用自动生成的密钥,但自动生成的密钥是服务器本地密钥,且集群中每台服务器都会自己生成密钥,且在负载均衡层面并未对此进行处理,这样当一个服务器生成的_VIEWSTATE负载被其他服务器使用就会遇到MAC验证失败问题。
当采用负载均衡集群提供服务时,ASP.NET要求所有服务器都必须具有相同的machineKey

解决方案

在其中一台服务器为应用程序生成machineKey,拷贝至其他服务器。
选择集群中的一台服务器
IIS管理器>服务器>网站>Default Web Site ,选择需要添加的应用程序,在右面的功能试图中双击“计算机密钥”,进入下面界面。
windows-gen-key
选择验证方法和加密方法;
验证密钥和解密密钥2个复选框均取消;
点击右侧的生成密钥,可以看到验证密钥和解密密钥对应的文本框中生成一串字母+数字的组合,然后点击应用。
以该服务器生成的密钥为基准,在其它服务器计算机密钥中选择相同的验证方法和加密方法,同时将验证密钥和解密密钥复制至其它服务器。

Recommended Posts