如何在 Azure 网站上设置 machineKey

Posted

技术标签:

【中文标题】如何在 Azure 网站上设置 machineKey【英文标题】:How to set machineKey on Azure Website 【发布时间】:2015-06-18 03:44:41 【问题描述】:

我正在运行一个 Azure 网站。每当我部署时,每个人都会退出,因为 machineKey 发生了变化。

我在web.config 中指定了machineKey,但这并没有解决问题。我相信这是因为 Azure 会自动覆盖 machineKey [1]。

我在这里发现了几个类似的问题,但答案链接到死链接。

那么,解决方案是什么?不管在 Azure 上如何部署,肯定有一种方法可以让用户保持登录状态。

【问题讨论】:

作为 WebRole 或通过 Azure 网站托管的网站? 您确定不是使用 InProc 会话让您的用户注销吗?我们使用 web.config 中指定的 machineKey 在 Azure 网站上使用自动缩放进行 cookie 加密,并且在扩展或新部署时更改机器密钥没有问题。 @miracledev 我很确定 InProc 会话在这里不相关。会话状态和身份验证的处理方式不同。用户的加密会话 cookie 包含将用户视为已登录所需的所有内容。服务器上不存储任何状态。 @Mr.Flibble 好吧,只是检查一下显而易见的,但正如我所说,我们使用 machineKey 进行加密,并且我们在跨部署读取加密数据时没有问题 :) 是否在共享网站下? 【参考方案1】:

尝试在Application_Start 上重置机器密钥配置部分:

protected void Application_Start()

    // ...

    var mksType = typeof(MachineKeySection);
    var mksSection = ConfigurationManager.GetSection("system.web/machineKey") as MachineKeySection;
    var resetMethod = mksType.GetMethod("Reset", BindingFlags.NonPublic | BindingFlags.Instance);

    var newConfig = new MachineKeySection();
    newConfig.ApplicationName = mksSection.ApplicationName;
    newConfig.CompatibilityMode = mksSection.CompatibilityMode;
    newConfig.DataProtectorType = mksSection.DataProtectorType;
    newConfig.Validation = mksSection.Validation;

    newConfig.ValidationKey = ConfigurationManager.AppSettings["MK_ValidationKey"];
    newConfig.DecryptionKey = ConfigurationManager.AppSettings["MK_DecryptionKey"];
    newConfig.Decryption = ConfigurationManager.AppSettings["MK_Decryption"]; // default: AES
    newConfig.ValidationAlgorithm = ConfigurationManager.AppSettings["MK_ValidationAlgorithm"]; // default: SHA1

    resetMethod.Invoke(mksSection, new object[]  newConfig );

以上假设您在<appSettings> 部分设置了适当的值:

<appSettings>
  <add key="MK_ValidationKey" value="...08EB13BEC0E42B3F0F06B2C319B..." />
  <add key="MK_DecryptionKey" value="...BB72FCE34A7B913DFC414E86BB5..." />
  <add key="MK_Decryption" value="AES" />
  <add key="MK_ValidationAlgorithm" value="SHA1" />
</appSettings>

但是您可以从任何您喜欢的配置源加载您的实际值。

【讨论】:

非常感谢@haim770。我现在正在测试它,它似乎正在工作。 @Mr.Flibble,我也在一个免费的 Azure 网站上对其进行了测试。不过,由于 Azure Websites 团队不断解锁Web.Config 越来越多的部分,我相信他们最终会让你在配置中正常设置 MachineKey。 很棒的实现@haim770。似乎这对我们不起作用。我们正在使用 .NET 4.6.1 并使用带有 app.UseCookieAuthentication() 的 OWIN 启动并使用 Redis 缓存会话提供程序。我实现了上述内容,但用户在插槽交换后不断退出。有什么想法吗?【参考方案2】:

如果 Azure 正在重写您的 machineKey,则您无能为力,因为它是其基础架构的一部分。但是,还有其他方法。

覆盖 FormsAuthentication

这应该不难,因为您可以轻松查找 FormsAuthentication 的源代码并创建自己的逻辑并用存储在 web.config 或数据库中的自己的密钥替换 MachineKey。

自定义身份验证过滤器

最简单的方法是创建过滤器并检查、验证、加密过滤器中的解密 cookie。如果解密成功,您需要在 OnAuthorization 方法上执行此操作并创建 IPrincipal 的新实例并将 IsAuthenticated 设置为 true。

OAuth

    启用 OAuth 并创建 OAuthProvider。但是,您需要在您控制的服务器上托管 OAuthProvider,因为这需要 machineKey 工作。 启用第三方 OAuth,如果您使用 Google、Facebook 等启用 OAuth,这将很容易,因为用户将被重定向到 OAuth 提供商,他们将继续自动登录并建立新会话。

【讨论】:

【参考方案3】:

我遇到了同样的问题,在我的情况下,我在 VS13 中使用 webdeploy to Azure 向导。我以为我要疯了,因为我会在 web.config 中设置机器密钥,然后在部署的 web.config 上将其更改为自动生成。它在 webdeploy 脚本/设置中。我的解决方案是使用服务器资源管理器从 VS13 中打开 live azure 站点,然后编辑 web.config 并保存更改。这使用我提供的密钥保留了我的设置,并且一切正常。

【讨论】:

以上是关于如何在 Azure 网站上设置 machineKey的主要内容,如果未能解决你的问题,请参考以下文章

在 Azure 网站上禁用池回收

如何在微软Azure上搭建个人博客网站

如何在 azure 网站上的 react 应用程序中替换 %PUBLIC_URL%

如何查找基本 Azure 网站的计算机名称

如何将 Azure Httptrigger 连接到网站?

分析在 azure 上运行的网站的性能的步骤