如何在Azure网站上设置machineKey

时间:2015-04-12 21:49:44

标签: asp.net authentication azure machinekey

我正在运行Azure网站。每当我部署时,每个人都会因为machineKey更改而退出。

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

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

那么,解决方案是什么?当然,无论Azure上的部署如何,都有办法让用户登录。

3 个答案:

答案 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

  1. 启用OAuth并创建OAuthProvider。但是,您需要在控制器中托管OAuthProvider,因为需要使用machineKey。
  2. 启用第三方OAuth,如果您通过Google,Facebook等启用OAuth,将很容易将用户重定向到OAuth提供商,他们将继续自动登录并建立新会话。

答案 2 :(得分:0)

我有同样的问题,在我的情况下,我在VS13中使用webdeploy到Azure向导。我以为我会疯狂,因为我会在web.config中设置machinekey,然后在已部署的web.config上将其更改为自动生成。它是webdeploy脚本/设置中的内容。我的解决方案是使用Server Explorer从VS13中打开实时azure站点,然后编辑web.config并保存更改。这使我提供的密钥保留了我的设置,一切正常。