我正在运行Azure网站。每当我部署时,每个人都会因为machineKey
更改而退出。
我在machineKey
中指定了web.config
,但这并没有解决问题。我相信这是因为Azure会自动覆盖machineKey
[1]。
我在这里发现了几个类似的问题,但答案链接到死链接。
那么,解决方案是什么?当然,无论Azure上的部署如何,都有办法让用户登录。
答案 0 :(得分:18)
尝试在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>
但您可以从任何您喜欢的配置源加载实际值。
答案 1 :(得分:1)
如果Azure正在重写您的machineKey,那么您无法做很多事情,因为它是其基础架构的一部分。但是,还有其他方法。
覆盖FormsAuthentication
这应该不难,因为您可以轻松查找FormsAuthentication的源代码并创建自己的逻辑,并将您自己的密钥替换为存储在web.config或数据库中的MachineKey。
自定义身份验证过滤器
最简单的方法是创建过滤器并检查,验证,加密过滤器中的解密cookie。您需要在OnAuthorization方法上执行此操作并创建IPrincipal的新实例,并在解密成功时将IsAuthenticated设置为true。
<强>的OAuth 强>
答案 2 :(得分:0)
我有同样的问题,在我的情况下,我在VS13中使用webdeploy到Azure向导。我以为我会疯狂,因为我会在web.config中设置machinekey,然后在已部署的web.config上将其更改为自动生成。它是webdeploy脚本/设置中的内容。我的解决方案是使用Server Explorer从VS13中打开实时azure站点,然后编辑web.config并保存更改。这使我提供的密钥保留了我的设置,一切正常。