Вы должны создать свою собственную задачу MSBuild.
Приведенный ниже код является пользовательской задачей.
Я сделал возможным мое приложение (winforms), но я выделил строки, которые можно изменить для веб-интерфейса.
Я создал абстрактный класс с 2 подклассами для обработки шифрования и дешифрования.
ура!
namespace MyCompany.MSBuild.Tasks.Security
{
using System;
using System.Linq;
using System.Diagnostics;
using System.Configuration;
//using System.Web.Configuration;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
public abstract class ConfigurationProtectorBaseTask : Task
{
private static readonly string RSA_PROVIDER = "RSAProtectedConfigurationProvider";
private static readonly string DATA_PROTECTION_PROVIDER = "DataProtectionConfigurationProvider";
/// <summary>
/// Gets or sets the ExePath. This would be the name of the .exe (or .dll) which has a corresponding .config associated with it.
/// </summary>
/// <value>The ExePath.</value>
[Required]
public string ExePath { get; set; }
/// <summary>
/// Gets or sets the SectionName of the configuration file you are trying to encrypt.
/// </summary>
/// <value>The SectionName.</value>
[Required]
public string SectionName { get; set; }
/// <summary>
/// Gets or sets the Provider.
/// </summary>
/// <value>The Provider.</value>
[Required]
public string Provider { get; set; }
/// <summary>
/// Task Entry Point.
/// </summary>
/// <returns></returns>
public override bool Execute()
{
if (!String.IsNullOrEmpty(this.Provider))
{
if (String.Equals(this.Provider, DATA_PROTECTION_PROVIDER, StringComparison.OrdinalIgnoreCase) || String.Equals(this.Provider, RSA_PROVIDER, StringComparison.OrdinalIgnoreCase))
{ }
else
{
Log.LogWarning(string.Format("Provider must be either '{0}' or '{1}'. Your value was '{2}'.", DATA_PROTECTION_PROVIDER, RSA_PROVIDER, this.Provider));
return false;
}
}
if (!String.IsNullOrEmpty(this.ExePath))
{
Log.LogCommandLine(string.Format("{0}", this.ExePath));
Console.WriteLine(this.ExePath);
}
InternalExecute();
return !Log.HasLoggedErrors;
}
protected abstract void InternalExecute();
protected Configuration GetConfiguration()
{
//WebVersion
//Configuration config = WebConfigurationManager.OpenWebConfiguration(this.ApplicationPath);
//NonAspNet version
Configuration config = ConfigurationManager.OpenExeConfiguration(ExePath);
return config;
}
}
}
namespace MyCompany.MSBuild.Tasks.Security
{
using System;
using System.Linq;
using System.Diagnostics;
using System.Configuration;
using System.Web.Configuration;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
public class ConfigurationProtectorEncrypterTask : ConfigurationProtectorBaseTask
{
/// <summary>
/// Internal Execute Wrapper.
/// </summary>
protected override void InternalExecute()
{
Configuration config = base.GetConfiguration();
ConfigurationSection section = config.GetSection(this.SectionName);
if (section != null && !section.SectionInformation.IsProtected)
{
section.SectionInformation.ProtectSection(this.Provider);
config.Save();
}
}
}
}
namespace MyCompany.MSBuild.Tasks.Security
{
using System;
using System.Linq;
using System.Diagnostics;
using System.Configuration;
using System.Web.Configuration;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
public class ConfigurationProtectorDecrypterTask : ConfigurationProtectorBaseTask
{
/// <summary>
/// Internal Execute Wrapper.
/// </summary>
protected override void InternalExecute()
{
Configuration config = base.GetConfiguration();
ConfigurationSection section = config.GetSection(this.SectionName);
if (section != null && section.SectionInformation.IsProtected)
{
section.SectionInformation.UnprotectSection();
config.Save();
}
}
}
}
::::Save this as: ConfigurationProtectorTaskTest.msbuild
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="AllTargetsWrapper" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask AssemblyFile="MyCompany.MSBuild.dll" TaskName="ConfigurationProtectorEncrypterTask"/>
<UsingTask AssemblyFile="MyCompany.MSBuild.dll" TaskName="ConfigurationProtectorDecrypterTask"/>
<Target Name="AllTargetsWrapper">
<CallTarget Targets="ConfigurationProtectorEncrypterTask1" />
<CallTarget Targets="ConfigurationProtectorDecrypterTask2" />
</Target>
<PropertyGroup>
<MyExePath>C:\SomeFolder\MyCompany.SomeExe.exe</MyExePath>
<MySectionName>connectionStrings</MySectionName>
<MyProvider>RSAProtectedConfigurationProvider</MyProvider>
</PropertyGroup>
<Target Name="ConfigurationProtectorEncrypterTask1">
<ConfigurationProtectorEncrypterTask ExePath="$(MyExePath)" SectionName="$(MySectionName)" Provider="$(MyProvider)">
</ConfigurationProtectorEncrypterTask>
</Target>
<Target Name="ConfigurationProtectorDecrypterTask2">
<ConfigurationProtectorDecrypterTask ExePath="$(MyExePath)" SectionName="$(MySectionName)" Provider="$(MyProvider)">
</ConfigurationProtectorDecrypterTask>
</Target>
</Project>
:REM BAT FILE TO CALL THE ABOVE .msbuild file
call "%VS90COMNTOOLS%\vsvars32.bat"
del *.log
msbuild /target:ConfigurationProtectorEncrypterTask1 ConfigurationProtectorTaskTest.msbuild /l:FileLogger,Microsoft.Build.Engine;logfile=ConfigurationProtectorEncrypterTask1.log
msbuild /target:ConfigurationProtectorDecrypterTask2 ConfigurationProtectorTaskTest.msbuild /l:FileLogger,Microsoft.Build.Engine;logfile=ConfigurationProtectorDecrypterTask2.log
Это также поможет:
http://www.codeproject.com/KB/dotnet/EncryptingTheAppConfig.aspx
http://www.beansoftware.com/ASP.NET-Tutorials/Encrypting-Connection-String.aspx
Но инкапсуляция в MSBuild Task - это мой вклад.
Второй URL выше также упоминает метод командной строки:
Вот этот цитируемый материал (то есть частичная цитата) :::
Шифрование / дешифрование с использованием инструмента командной строки aspnet_regiis.exe
Вы также можете зашифровать и расшифровать разделы в файле Web.config с помощью инструмента командной строки aspnet_regiis.exe, который находится в каталоге \ Microsoft.Net \ Framework \ version. Чтобы зашифровать раздел файла Web.config с помощью машинного ключа DPAPI с помощью этого инструмента командной строки, используйте следующую команду.
aspnet_regiis.exe -pe "connectionStrings" -app "/ YourWebSiteName" - prov "DataProtectionConfigurationProvider"
Чтобы расшифровать раздел connectionStrings с помощью этого инструмента, вы можете указать следующую команду в инструменте aspnet_iisreg.exe.
aspnet_regiis.exe -pd "connectionStrings" -app "/ YouWebSiteName"