最近我将项目从Framework 4.6升级到了4.6.1。我们开始面临以下问题:
我们结合所有css文件来生成一个通用的css文件。在此过程中,AjaxControlToolkit日历会创建一个WebResource.axd文件。当我们尝试处理该文件时,解密将失败,并引发错误,指出:“无法验证数据”。
使用以下代码:
var queryString = WebResourcePath.Split(new[] { '?' })[1];
var stringBuilder = new StringBuilder();
var textWriter = new StringWriter(stringBuilder);
var context = new HttpContext(new SimpleWorkerRequest("/WebResource.axd", queryString, textWriter));
var urlEncodedData = context.Request.QueryString["d"];
var encryptedData = HttpServerUtility.UrlTokenDecode(urlEncodedData);
var machineKeySection = typeof(MachineKeySection);
var paramTypes = new Type[] { typeof(bool), typeof(byte[]), typeof(byte[]), typeof(int), typeof(int) };
var encryptOrDecryptData = machineKeySection.GetMethod("EncryptOrDecryptData", BindingFlags.Static | BindingFlags.NonPublic, null, paramTypes, null);
try
{
var decryptedData = (byte[])encryptOrDecryptData.Invoke(null, new object[] { false, encryptedData, null, 0, encryptedData.Length });
var decryptedContent = Encoding.UTF8.GetString(decryptedData).Substring(1);
var resourceParts = decryptedContent.Split('|');
Assembly = AssemblyCache.Load(resourceParts[0]);
ResourceName = resourceParts[1];
}
catch (Exception ex)
{
throw ex;
}
在行上抛出错误:var cryptoedData =(byte [])encryptOrDecry ........
某些解决方案我建议使用静态机器密钥,但我们已经在这样做了。
注意:仅当我们将httpRuntime targetFramework设置为4.6.1时,才会发生这种情况,否则它将按预期工作。
答案 0 :(得分:0)
来自forums.asp.net:
所以我们的问题是某些Webresource.axd请求被缓存 浏览器(我们不知道...),但是我们的机器键会更改。
修复Web.config中的machineKeys,然后等待所有用户清理 他们的浏览器缓存。
评论:
https://forums.asp.net/post/5620791.aspx
全线程: https://forums.asp.net/t/1963234.aspx?Unable+to+validate+data+EncryptOrDecryptData+problem
希望有帮助