如何在 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的主要内容,如果未能解决你的问题,请参考以下文章