保存加密配置部分时阻止 IIS 应用重启

本文关键字:IIS 应用 重启 加密 配置部 分时 保存 | 更新日期: 2023-09-27 18:35:52

我正在帮助构建一个具有多个自定义配置文件的 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

保存加密配置部分时阻止 IIS 应用重启

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

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