http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 3979|回复: 1

[Asp.Net] Validation of viewstate MAC failed 用machineKey 完美解决

[复制链接]
发表于 2015-3-26 15:28:20 | 显示全部楼层 |阅读模式
先来看问题吧 QQ截图20150326152519.jpg


不知道为嘛出了这个错,

后台才发现
<machineKey>这个节允许你设置用于加密数据和创建数字签名的服务器特定的密钥。ASP.NET自动使用它来保护表单验证Cookie,你也可以将它用于受保护的视图状态数据。同时,这个密钥还用于验证进程外的会话状态提供程序。
       如果你在使用Web集群并在多台计算机上运行同一个应用程序,如果对页面的请求由一台计算机处理,而页面回发又由另一台计算机处理,第二个服务器就不能解密来自第一台服务器的视图状态和表单Cookie。这个问题之所以会发生,是因为两台服务器使用了不同的密钥。

说白了就是一个程序分布到不同的电脑,使用了不同的加密方式,然后交叉访问,出现了解密不成功的后果

处理方法如下

要解决这个问题,你必须显式的在machine.config文件中定义这个密钥:
[XML] 纯文本查看 复制代码
<machineKey validationKey = "128位" decryptionKey = "48位" />

其中,validationKey 的值可以是48到128个字符长,强烈建议使用可用的最长密钥。decryptionKey 的值可以是16到48字符长,建议使用48字符长。
       自己去手动创建验证密钥和解密密钥并没有多大的意义。如果你这么做的话,它们可能随机性不足,这就可能允许某种类型的攻击。更好的办法是使用代码和.NET加密类(System.Security.Cryptography 命名空间)生成随机密钥,代码如下
[C#] 纯文本查看 复制代码
using System;
using System.Security.Cryptography;
using System.Text;
 
/// <summary>
/// 各类工具
/// </summary>
public class Tools
{
    /// <summary>
    /// 使用加密服务提供程序实现加密生成随机数
    /// </summary>
    /// <param name="length"></param>
    /// <returns>16进制格式字符串</returns>
    public static string CreateMachineKey(int length)
    {
        // 要返回的字符格式为16进制,byte最大值255
        // 需要2个16进制数保存1个byte,因此除2
        byte[] random = new byte[length / 2];
 
        // 使用加密服务提供程序 (CSP) 提供的实现来实现加密随机数生成器 (RNG)
        RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
 
        // 用经过加密的强随机值序列填充字节数组
        rng.GetBytes(random);
 
        StringBuilder machineKey = new StringBuilder(length);
        for (int i = 0; i < random.Length; i++)
        {
            machineKey.Append(string.Format("{0:X2}", random[i]));
        }
        return machineKey.ToString();
    }
}
调用方法
[C#] 纯文本查看 复制代码
string decryptionKey = Tools.CreateMachineKey(48);
string validationKey = Tools.CreateMachineKey(128);

说白了就是提供一个生成加密串的方法让大家使用



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2015-3-26 23:06:20 | 显示全部楼层
看过帖子回复一下是个好习惯
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-19 06:58

© 2014-2021

快速回复 返回顶部 返回列表