在Web农场网站中向web.config添加machineKey

64
我们(我们的IT合作伙伴)最近为我们的网站进行了一些 DNS 更改,以便两个生产服务器之间进行循环 DNS 切换。在进行此切换之前,我们并没有遇到 WebResource.axd 文件方面的问题。自从切换后,当我们访问公共 URL 时,我们会收到以下错误信息:
CryptographicException Padding is invalid and cannot be removed.
当我们直接访问这两个服务器本身时,它们能够正常加载。我已经研究了这个问题,看起来因为它们在两个服务器之间共享资源,我们需要在每台服务器的 web.config 中拥有一个一致的 machineKey,以便它们可以在两个服务器之间进行一致的加密和解密。我的问题是:
1. 我能否通过服务器上的工具生成 machineKey,还是需要编写代码来完成此操作? 2. 我只需要将 machineKey 添加到每个服务器的 web.config 中,还是您认为我需要做其他任何事情才能使这两个服务器协同工作?(目前,两个 web.config 均不包含 machineKey。)

请尝试在http://serverfault.com/上发布。 - TimS
2
@TimS -- 好的。我只是因为带有 .NET 的 web.config 所以想到 SO,但我会适当迁移。谢谢。 - Mark Ursino
没问题,在那里可能会得到更多回复。 - TimS
3个回答

80

这应该能回答以下问题:

如何在ASP.NET 2.0中配置MachineKey - Web Farm部署注意事项

Web Farm Deployment Considerations

If you deploy your application in a Web farm, you must ensure that the configuration files on each server share the same value for validationKey and decryptionKey, which are used for hashing and decryption respectively. This is required because you cannot guarantee which server will handle successive requests.

With manually generated key values, the settings should be similar to the following example.

<machineKey  
validationKey="21F090935F6E49C2C797F69BBAAD8402ABD2EE0B667A8B44EA7DD4374267A75D7
               AD972A119482D15A4127461DB1DC347C1A63AE5F1CCFAACFF1B72A7F0A281B"       

decryptionKey="ABAA84D7EC4BB56D75D217CECFFB9628809BDB8BF91CFCD64568A145BE59719F"
validation="SHA1"
decryption="AES"
/>

If you want to isolate your application from other applications on the same server, place the in the Web.config file for each application on each server in the farm. Ensure that you use separate key values for each application, but duplicate each application's keys across all servers in the farm.

简而言之,要设置机器密钥,请参考以下链接: 设置机器密钥 - Orchard文档
引用: 使用IIS管理器设置机器密钥 如果您可以访问安装Orchard的服务器的IIS管理控制台,则这是最简单的设置机器密钥的方法。 启动管理控制台,然后选择网站。打开机器密钥配置: The IIS web site configuration panel 机器密钥控制面板具有以下设置: The machine key configuration panel 对于验证密钥和解密密钥,请取消“在运行时自动生成”。 单击面板右侧的“操作”下的“生成密钥”。 单击“应用”。 并且,如果不存在,请在所有webservers下的system.web标记中的web.config文件中添加以下行。
<machineKey  
    validationKey="21F0SAMPLEKEY9C2C797F69BBAAD8402ABD2EE0B667A8B44EA7DD4374267A75D7
                   AD972A119482D15A4127461DB1DC347C1A63AE5F1CCFAACFF1B72A7F0A281B"           
    decryptionKey="ABAASAMPLEKEY56D75D217CECFFB9628809BDB8BF91CFCD64568A145BE59719F"
    validation="SHA1"
    decryption="AES"
/>

请确保您拥有机器密钥和web.config文件的永久备份


2
如果它不能正常工作,请从上面的代码行中删除“validation =” SHA1“decryption =” AES“,然后它就可以正常工作了。 - John
你知道如何为Azure Web App设置相同的内容吗?我们想要一个具有高可用性灾难恢复(HADR)的ASP.Net MVC应用程序。对于Azure设置,我们无法从IIS生成Machine Key,而是使用博客链接。但是我们遇到了内部服务器错误(500)。 - Mihir Shah
@BlackICE,我在上面的评论中忘记提到你的名字了。你知道如何为MS Azure Web App设置相同的内容吗? - Mihir Shah
对于其他人来说,如果在web.config中尚未配置machineKey部分,可以在%SystemRoot%\Microsoft.NET\Framework\%VersionNumber%\CONFIG\web.config.comments找到默认位置。 - Cristian Rusanu
在 machine.config 中添加什么? - Kiquenet
2
SHA1似乎已经过时了。截至2021年8月28日,来自微软的文档建议改用HMACSHA256或其他替代方案... https://learn.microsoft.com/en-us/dotnet/api/system.web.configuration.machinekeyvalidation?view=netframework-4.8 - Allen

22
如果您使用的是 IIS 7.5 或更高版本,则可以从 IIS 生成 MachineKey 并直接将其保存到您的 web.config 中,在 Web farm 中,然后只需将新的 web.config 复制到每个服务器上。
步骤如下:
  1. 打开 IIS 管理器。
  2. 如果您需要为所有应用程序生成并保存 MachineKey,请在左窗格中选择服务器名称。在这种情况下,您将修改根 web.config 文件(位于.NET Framework 文件夹中)。如果您的意图是为特定的网站/应用程序创建 MachineKey,则从左窗格中选择该网站/应用程序。在这种情况下,您将修改应用程序的 web.config 文件。
  3. 在中间窗格的 ASP.NET 设置中双击 Machine Key 图标:
  4. MachineKey 部分将从配置文件中读取并显示在 UI 中。如果您没有配置特定的 MachineKey 并且它是自动生成的,则会看到以下选项:
  5. 现在您可以单击右窗格上的 Generate Keys 以生成随机的 MachineKeys。当您单击应用时,所有设置将保存在 web.config 文件中。
详情请见Easiest way to generate MachineKey – Tips and tricks: ASP.NET, IIS and .NET development…

未找到http://blogs.msdn.com/b/amb/archive/2012/07/31/easiest-way-to-generate-machinekey.aspx。 - Kiquenet
这应该是类似的,谁知道这个链接能持续多久。https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-r2-and-2008/cc731979(v=ws.10) - BlackICE

8
请确保从刚刚发生的填充oracle asp.net漏洞中学习(你应用了补丁,对吧?...),并使用受保护的部分来加密机器密钥和任何其他敏感配置。另一种选择是在机器级web.config中设置它,这样它甚至不在网站文件夹中。要生成它,只需像David答案中链接的文章那样做即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接