【问题标题】:MachineKey Azure SDK 1.5/1.6MachineKey Azure SDK 1.5/1.6
【发布时间】:2012-01-31 00:14:33
【问题描述】:

我在 Azure 上使用 WCF Web API 使用自定义 Api 令牌实现。这使用 FormsAuthentication.Decrypt 来获取 FormsAuthenticationTicket。为了确保 decrpyt 进程可以跨多个实例工作,我在 web.config 中提供了一个 MachineKey。 但是,我注意到 MachineKey 似乎无法在 Azure 上运行,因为 Azure 似乎正在使用随机机器密钥并覆盖我在 web.config 中指定的机器密钥我正在使用最新的 Azure SDK 1.5(或1.6?)

我很清楚 Azure SDK 1.3 的这个问题,我相信这个问题在 1.4 中得到了纠正。此问题是否有可能在 Azure SDK1.5/1.6 上再次出现?

【问题讨论】:

  • 只是想提供有关此问题的更新。我使用远程桌面登录到 Azure 托管服务部署,并且物理文件上的 machineKey 似乎是正确的。由于某种原因,感觉 FormsAuthentication.Decrypt 无法生成 FormsAuthenticationTicket。这张票无效的原因可能是什么?

标签: azure wcf-web-api azure-web-roles


【解决方案1】:

Windows Azure 已经在部署中跨相同角色同步机器密钥。因此,您应该完全忽略 web.config 中的 MachineKey 设置,让 Windows Azure 为您处理它(网络农场场景得到很好的支持)。 Windows Azure 支持您的方案,无需修改(只需调用 Decrypt)。

您可能谈论的问题是 1.3 版本的问题,其中 web.config 文件被直接修改以同步机器密钥。当文件为只读(即 TFS 源代码控制)并导致部署失败时,此操作失败。前段时间已修复。

【讨论】:

  • 您好,感谢您的回复。不幸的是,我需要控制 MachineKey,因为我的 Web 服务和网站驻留在完全不同的实例上加密/解密身份。想知道是否有办法确保我指定的机器密钥确实被使用了。
  • 我仍然认为你在这里遗漏了一些东西。正如我所提到的,Azure 将自动在角色中的所有实例之间同步机器密钥。它已经准备好 webfarm 了。唯一的时间机器密钥同步将是一个问题,如果您尝试在不同的角色(而不是单个角色的实例)中加密和解密。
【解决方案2】:

我想我终于找到了解决方案。这与 Azure 或 MachineKeys 无关,而与测试应用程序的方式有关。存储在我的电话应用程序上的加密密钥在不同的 Web 服务器上加密(但是,使用的机器密钥是相同的)。我刚刚卸载并重新安装了我的应用程序,从而强制服务器生成一个新密钥。

似乎在另一台服务器上解密此密钥会导致问题。我有点担心这是否会在将来引起问题。不应该使用相同的机器密钥来确保加密/解密跨盒子工作吗?

无论如何,对于给您带来的不便,我深表歉意。

【讨论】:

    【解决方案3】:

    我们似乎也有同样的问题。我们在 web.config 文件中设置 machinekey 集。直到几天前 Decrypt 开始返回 null 之前,一切都很好。所有机器上的解密密钥和验证密钥都是相同的。不确定是什么问题。

    编辑 - Azure v1.6 似乎尊重我们在配置文件中设置的机器密钥。我们想出了如何解决我们的问题 - 也许这会对您有所帮助 - 我们看到 cookie 上的解密在我们的 Windows 7 64 位开发机器上不起作用。然后我们检查了挂起的更新,并且有几个与安全相关的 .NET 更新。我们运行了更新,瞧,事情又开始工作了。

    【讨论】:

    • 有趣。是的,我绝对可以重现这个问题。困扰我的是,如果我启动一个新的托管服务实例并且由于该实例没有生成加密字符串而无法验证用户,则此解密将失败。现在,只有在 THAT 给定的服务器加密数据的情况下,解密才有效。这绝对是错误的。我在我们的测试环境中的其他服务器上安装了相同的服务,这似乎可以肯定。目前这似乎是一个严重的障碍
    【解决方案4】:

    好的,所以我在 3 服务器 NLB 组中遇到了上述问题。

    看起来 Windows 自动更新已在三台服务器中的两台上安装了 KB2656352、KB2656358 和 KB2657424。

    我认为这是因为有些服务器正在运行该补丁,而有些则没有。我猜已经打补丁的机器不喜欢解码由未打补丁的机器编码的东西(和/或反之亦然)。

    不管怎样,我已经在剩下的机器上安装了所有三个补丁,并把它放回了 NLB 组。似乎一切正常。

    【讨论】:

      【解决方案5】:

      在最近的 Microsoft .Net 4.0 安全升级 KB2656351 之后,我的 FormsAuthentication 票证没有跨子域验证,我遇到了同样的问题。

      我的 FormsAuth 票证是从我的专用服务器生成的,并在 Windows Azure 上的子域上读取。

      为了让所有子域解密票证,我确保我所有的专用服务器都通过 Windows 更新使用最新的 .Net 更新进行了修补。然后我将我的 Azure 项目升级到 1.6 版,并在部署后选择了最新的 Azure OS。这似乎可以解决问题。

      这里有一些关于这个问题的文章:

      http://weblogs.asp.net/scottgu/archive/2011/12/28/asp-net-security-update-shipping-thursday-dec-29th.aspx

      http://technet.microsoft.com/en-us/security/bulletin/ms11-100.mspx

      干杯

      弗朗西斯科

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-25
        • 2012-09-04
        • 1970-01-01
        • 2011-07-08
        • 2016-06-08
        • 1970-01-01
        相关资源
        最近更新 更多