30

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

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

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

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

4

3 回答 3

23

尝试重置机器密钥配置部分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>

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

于 2015-04-21T07:14:59.777 回答
1

如果 Azure 正在重写你的 machineKey,你就无能为力了,因为它是他们基础设施的一部分。但是,还有其他方法。

覆盖 FormsAuthentication

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

自定义身份验证过滤器

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

身份验证

  1. 启用 OAuth 并创建 OAuthProvider。但是,您需要在您控制的服务器上托管 OAuthProvider,因为这需要 machineKey 工作。
  2. 启用第三方 OAuth,如果您使用 Google、Facebook 等启用 OAuth,这将很容易,因为用户将被重定向到 OAuth 提供者,他们将继续自动登录并建立新会话。
于 2015-04-21T05:34:21.163 回答
0

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

于 2015-07-11T18:01:43.530 回答