我正在运行Azure网站。无论何时我部署,每个人都会因为machineKey
更改而被注销。如何在Azure网站上设置machineKey
我在web.config
中指定了machineKey
,但这并未解决问题。我相信这是因为Azure会自动覆盖machineKey
[1]。
我在这里发现了一些类似的问题,但答案链接到死链接。
那么,有什么解决方案?当然,有一种方法可以让用户无论在Azure上进行部署,都可以保持登录状态。
我正在运行Azure网站。无论何时我部署,每个人都会因为machineKey
更改而被注销。如何在Azure网站上设置machineKey
我在web.config
中指定了machineKey
,但这并未解决问题。我相信这是因为Azure会自动覆盖machineKey
[1]。
我在这里发现了一些类似的问题,但答案链接到死链接。
那么,有什么解决方案?当然,有一种方法可以让用户无论在Azure上进行部署,都可以保持登录状态。
如果Azure正在重写您的machineKey,那么您无法做太多的工作,因为它是基础架构的一部分。但是,还有其他方法。
覆盖FormsAuthentication
这不应该是困难的,因为你可以很容易地查找了FormsAuthentication的源代码,并创建自己的逻辑和存储在web.config中或在你的数据库自己的密钥更换的machineKey。
自定义身份验证筛选
最简单的方法是创建一个过滤器,检查,验证,加密解密cookies在你的过滤器。您需要在OnAuthorization方法上执行此操作,并创建IPrincipal的新实例,并在解密成功时将IsAuthenticated设置为true。
的OAuth
试图将机器按键部分配置在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网站团队不断解锁越来越多的'Web.Config'部分,我相信他们最终会让您在配置中正常设置MachineKey。 – haim770
真棒执行@ haim770。看来这不是为我们工作。我们使用.NET 4.6.1并使用OWIN启动与app.UseCookieAuthentication()并使用Redis缓存会话提供程序。我实现了上述功能,但用户在插槽交换后不断注销。有任何想法吗? – gorillapower
我有同样的问题,在我的情况下,我在VS13中使用webdeploy到Azure向导。我以为我疯了,因为我会在web.config中设置机器密钥,然后它将在部署的web.config上更改为自动生成。它在webdeploy脚本/设置中。我的解决方案是使用服务器资源管理器从VS13中打开实时Azure站点,然后编辑web.config并保存更改。这保存我的设置与我提供的键和一切正常。
以WebRole或通过Azure网站托管的网站? –
一个Azure网站。 –
你确定它没有使用InProc会话来让你的用户注销吗?我们使用web.config中指定的machineKey在Azure网站上使用自动缩放进行cookie加密,并且在扩展或新部署时更改机器键方面没有问题。 – jakobandersen