簡體   English   中英

加密XML自定義配置文件

[英]Encrypting XML custom configuration file

我有這種方法可以從我的XML“自定義配置”配置文件中填充一個對象:

public static BindingList<StationConfiguration> GetStationsFromConfigFile()
{
    string xmlDocumentText = File.ReadAllText(GetConfigFilePath());
    var doc = new XmlDocument();
    doc.LoadXml(xmlDocumentText);

    BindingList<StationConfiguration> stations = new BindingList<StationConfiguration>();
    foreach (XmlNode node in doc.DocumentElement["StationsSection"].ChildNodes[0].ChildNodes)
    {
        stations.Add(
            new StationConfiguration(
                node.Attributes["Comment"].Value
                , node.Attributes["FtpUsername"].Value
                , node.Attributes["FtpPassword"].Value
                , node.Attributes["DestinationFolderPath"].Value
            ));
    }

    return stations;
}

如您所見,我正在使用File.ReadAllText將XML配置文件的內容提取為String。

對於非加密的配置文件,這一切都很好。 但是現在我需要加密它。 MSDN建議這樣做的方式是這樣開始的:

System.Configuration.Configuration config =
    ConfigurationManager.OpenExeConfiguration(
    ConfigurationUserLevel.None);

(順便說一句,當我看config.FilePath屬性,它讓我看到XML配置文件的正確路徑,只是有一些奇怪的原因一個額外的“的.config”延伸,它與名為“.exe.config。 配置 ”結束出於某種奇怪的原因, 但我離題了……

這是我的StationConfigurationSection類:

public class StationConfigurationSection : ConfigurationSection
{
    [ConfigurationProperty("Stations", IsDefaultCollection = false)]
    [ConfigurationCollection(typeof(StationCollection),
        AddItemName = "add",
        ClearItemsName = "clear",
        RemoveItemName = "remove")]
    public StationCollection Stations
    {
        get
        {
            return (StationCollection)base["Stations"];
        }
    }

    public override bool IsReadOnly()
    {
        return false;
    }
}

我完整的XML配置文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="StationsSection" type="EcFtpClient.StationConfigurationSection, EcFtpClient" />
  </configSections>
  <StationsSection>
    <Stations>
      <add Comment="ABC" FtpUsername="eliezer" FtpPassword="secret" DestinationFolderPath="C:\Users\eliezer\Desktop\local dest" FtpTimeoutInSeconds="30" FtpHostname="ftp://192.168.1.100/" FtpFolderPath="" />
    </Stations>
  </StationsSection>
  <startup>
    <supportedRuntime version="v2.0.50727" />
  </startup>
  <appSettings>
    <add key="NameOfService" value="ECClient" />
    <add key="PollingFrequencyInSeconds" value="60" />
  </appSettings>
</configuration>

我想使用MSDN System.Configuration方法,因為它使加密很容易,但是如何將他們的方法與必須的方法結合起來呢?


-更新-
我已經加載了文件,但是在保存文件時仍然卡住了。

我將加載方法(在此問題的最頂部)更改為:

public static BindingList<StationConfiguration> GetStationsFromConfigFile()
{
    Configuration config = ConfigurationManager.OpenExeConfiguration(GetConfigFilePath());
    StationConfigurationSection stationsConfig = (StationConfigurationSection)config.GetSection("StationsSection");
    var stationCollection = ((StationCollection)stationsConfig.Stations);

    BindingList<StationConfiguration> stationsToReturn = new BindingList<StationConfiguration>();

    for (int index = 0; index < stationCollection.Count; index++)
    {
        stationsToReturn.Add(
            new StationConfiguration(
                stationCollection[index].Comment,
                stationCollection[index].FtpUsername,
                stationCollection[index].FtpPassword,
                stationCollection[index].DestinationFolderPath)
            );

    return stationsToReturn;
}

使我感到滿意的是,無論文件是否經過加密,都可以加載文件-成功加載。 那很棒。

但是我仍然不確定如何節省工作。 這是我的保存方法:

public static void SaveStationsToConfigFile(BindingList<StationConfiguration> updatedStations, bool isConfigToBeEncrypted)
{
    string configFilePath = GetConfigFilePath();

    var xDoc = XDocument.Load(configFilePath);
    var xDeclaration = xDoc.Declaration;
    var xElement = xDoc.XPathSelectElement("//StationsSection/Stations");

    // clear out existing station configurations
    xDoc.Descendants("Stations").Nodes().Remove();

    foreach (var station in updatedStations)
    {
        xElement.Add(new XElement("add",
                new XAttribute("Comment", station.Station),
                new XAttribute("FtpUsername", station.Username),
                new XAttribute("FtpPassword", station.Password),
                new XAttribute("DestinationFolderPath", station.FolderName),
                new XAttribute("FtpTimeoutInSeconds", 30),
                new XAttribute("FtpHostname", GetEnvironmentAppropriateFtpHostName()),
                new XAttribute("FtpFolderPath", GetEnvironmentAppropriateFtpFolderPath())
        ));
    }

    xDoc.Declaration = xDeclaration;
    xDoc.Save(configFilePath);
}

為了使用保護/加密功能保存它,我需要執行以下操作-換句話說,使用System.Configuration.Configuration對象:

stationsConfig.SectionInformation.ProtectSection("RsaProtectedConfigurationProvider");
stationsConfig.SectionInformation.ForceSave = true;
objConfig.Save(ConfigurationSaveMode.Modified);

但是我目前仍在使用XDocument.Save進行保存...

有沒有一種方法可以將我的XDocument轉換為與System.Configuration.Configuration兼容的對象?
想到的黑客是在調用XDocument.Save -加載它並使用System.Configuration.Configuration東西再次保存。 但這是駭客...

我相信您必須與配置設置框架一起使用。 無需嘗試自己打開xml文件,而是需要創建ConfigurationSection的后代。

這樣,它將為您從加密配置讀取和寫入。

看來您已經開始了該路由( EcFtpClient.StationConfigurationSection ),但是您沒有包含任何代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM