【问题标题】:Prevent IIS app restart when saving an encrypted configuration section?保存加密配置部分时防止 IIS 应用程序重新启动?
【发布时间】:2012-06-06 04:48:43
【问题描述】:

我正在帮助构建一个带有多个自定义配置文件的 ASP.NET C# 应用程序。我们使用<configSections><section /></configSections> 元素将这些存储在web.config 文件之外,确保设置restartOnExternalChanges="false" 以便文件保存不会重新启动应用程序。

为了管理这些设置,我们构建了 ASPX 页面来读取、更新和保存各个部分和值。对于纯文本部分,这非常有效。管理员登录应用程序的配置部分,进行更改,保存并立即生效。

但我们有一个部分,在它自己的外部文件中,与所有其他部分一样,也是加密的。每当保存该部分时,IIS 应用程序都会重新启动而丢失会话。这意味着登录的管理员进行配置更改,并且所有最终用户登录到应用程序的用户端,都必须再次登录,这令人沮丧。

在保存加密的配置部分时,有什么方法可以避免 IIS 应用程序重新启动?

我们当前的加密配置部分处理代码如下所示:

public class CredentialsConfig : ConfigurationSection
{
    Configuration Config = null;
    CredentialsConfig Section = null;

    public static CredentialsConfig GetConfig()
    {
        Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
        CredentialsConfig section = config.GetSection("credentials") as CredentialsConfig;

        // Ensure the current file is encrypted
        if (!section.SectionInformation.IsProtected)
        {
            section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
            section.SectionInformation.ForceSave = true;
            config.Save();
        }

        return section;
    }

    public CredentialsConfig GetConfigForUpdate()
    {
        Config = WebConfigurationManager.OpenWebConfiguration("~");
        Section = Config.GetSection("credentials") as CredentialsConfig;
        return Section;
    }

    public void SaveConfig()
    {
        Section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
        Section.SectionInformation.ForceSave = true;
        Config.Save(ConfigurationSaveMode.Modified);
        ConfigurationManager.RefreshSection("credentials");
    }

    [ConfigurationProperty("administrator")]
    public AdministratorConfigurationElement Administrator
    {
        get
        {
            return this["administrator"] as AdministratorConfigurationElement;
        }
    }
}

我们的使用方式如下:

CredentialsConfig credentialsConfig = new CredentialsConfig();
AdministratorConfigurationElement newConfig = credentialsConfig.GetConfigForUpdate().Administrator;
// setting attributes in the section's <administrator /> element
credentialsConfig.SaveConfig();
// frustrating app restart happens

【问题讨论】:

  • 配置部分是否需要驻留在应用程序配置文件中,或者它们是否可以存储在另一个单独的 (XML) 文件中?
  • 原始问题提到它们今天存储在web.config 文件之外。这就是我们在保存其他非加密部分时避免应用重启的方法。

标签: c# asp.net iis encryption configuration-files


【解决方案1】:

没有。对 .config 文件的修改是始终会重新启动应用程序的自动触发器之一。

就我个人而言,我建议将经常修改的项目从 .config 文件中移到数据库、注册表或其他可以加密和保护且不存在问题的地方。

【讨论】:

  • 显然与加密有关。我们其他未加密的部分在保存文件时不会重新启动应用程序。
  • 虽然我认为这个答案在技术上并不适用于我的特定案例,但没有人提供其他选择,我无法让它发挥作用。所以,实际上,答案似乎是“不”。
猜你喜欢
  • 2011-12-30
  • 2012-03-06
  • 1970-01-01
  • 2023-03-27
  • 2011-03-18
  • 2014-03-22
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
相关资源
最近更新 更多