У меня есть веб-приложение, которое развернуто на моем локальном сервере IIS под Sites\Default
, оно отлично работает и сейчас я хочу сделать его более безопасным - я хочу зашифровать строки подключения и appSettings.
Внутри файла pubxml я добавил эту строку:
<MSDeployEnableWebConfigEncryptRule>true</MSDeployEnableWebConfigEncryptRule>
но это только шифрует строки соединений. Я знаю, что я могу вручную вызвать:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis -pe "appSettings" -site Default -app "/"
на моем сервере после развертывания для шифрования внешнего файла, содержащего appSettings, но я должен сделать это вручную.
Мой вопрос заключается в том, как я могу развернуть веб-сайт из Visual Studio (Build > Publish) и выполнить команду aspnet_regiis
автоматически после публикации.
I нашел информацию, что я мог бы использовать runcommand
и другое о bat файлы, но я не вызываю MSDeploy из командной строки.
Я также нашел информацию о том, что я должен создать пользовательский поставщик и вызвать его из MSDeploy.
Как мне изменить файл pubxml, чтобы получить это поведение?
EDIT1:
Мне удалось привязать After Deploy
Target, используя:
<Target Name="EncryptAppSettings" AfterTargets="MSDeployPublish" >
<Message Text="Encrypting appSettings" />
<Exec Command="aspnet_regiis -pe "appSettings" -site Default -app "/"" />
<Message Text="AppPath: $(DeployIisAppPath)" />
</Target>
Но теперь я получаю эту ошибку:
Команда "aspnet_regiis -pe" appSettings "-site Default -app" /"" с кодом 9009.
EDIT2:
Я пробовал использовать runCommand следующим образом:
<ItemGroup>
<MsDeploySourceManifest Include="runCommand">
<path>aspnet_regiis -pe "appSettings" -site Default -app "/"</path>
<waitInterval>10000</waitInterval>
<AdditionalProviderSettings>waitInterval</AdditionalProviderSettings>
</MsDeploySourceManifest>
</ItemGroup>
но мне не повезло. Я нашел блог о postSync: runCommand, но я бы хотел называть это напрямую из VS, поэтому я хотел бы добавить это для публикации профиля.
EDIT3:
Я добавляю свой профиль публикации ниже:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<WebPublishMethod>MSDeploy</WebPublishMethod>
<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
<LastUsedPlatform>Any CPU</LastUsedPlatform>
<SiteUrlToLaunchAfterPublish />
<LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
<ExcludeApp_Data>False</ExcludeApp_Data>
<MSDeployServiceURL>192.168.5.50</MSDeployServiceURL>
<DeployIisAppPath>Default</DeployIisAppPath>
<RemoteSitePhysicalPath />
<SkipExtraFilesOnServer>False</SkipExtraFilesOnServer>
<MSDeployPublishMethod>WMSVC</MSDeployPublishMethod>
<EnableMSDeployBackup>True</EnableMSDeployBackup>
<MSDeployEnableWebConfigEncryptRule>True</MSDeployEnableWebConfigEncryptRule>
<UserName>LocalAdmin</UserName>
<_SavePWD>True</_SavePWD>
<PublishDatabaseSettings>
<Objects xmlns="">
<ObjectGroup Name="ApplicationDbContext" Order="1" Enabled="False">
<Destination Path="Data Source=192.168.5.51;Initial Catalog=GameBit;User ID=GUser;Password=MyRealPassword;Application Name=EntityFramework" Name="Data Source=192.168.5.51;Initial Catalog=GameBit;User ID=GUser;Password=MyRealPassword;MultipleActiveResultSets=True;Application Name=EntityFramework" />
<Object Type="DbCodeFirst">
<Source Path="DBContext" DbContext="Api.ApplicationDbContext, Api" Origin="Configuration" />
</Object>
</ObjectGroup>
</Objects>
</PublishDatabaseSettings>
</PropertyGroup>
<PropertyGroup>
<UseMsdeployExe>true</UseMsdeployExe>
<AllowUntrustedCertificate>True</AllowUntrustedCertificate>
</PropertyGroup>
<ItemGroup>
<MSDeployParameterValue Include="$(DeployParameterPrefix)ApplicationDbContext-Web.config Connection String">
<ParameterValue>metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string="Data Source=192.168.5.51;Initial Catalog=GameBit;User ID=GUser;Password=MyRealPassword;MultipleActiveResultSets=True;Application Name=EntityFramework"</ParameterValue>
</MSDeployParameterValue>
</ItemGroup>
<!--<ItemGroup>
<MsDeploySourceManifest Include="runCommand">
<Path>dir</Path>
</MsDeploySourceManifest>
</ItemGroup>-->
<!--<Target Name="EncryptImportantSettings" AfterTargets="MSDeployPublish" >
<Message Text="Encrypting appSettings" />
--><!--<Exec Command="aspnet_regiis -pe "appSettings" -site Default -app "/"" />--><!--
<ItemGroup>
<MsDeploySourceManifest Include="runCommand">
<path>dir/b >> C:\temp\log.txt</path>
--><!--<waitInterval>10000</waitInterval>--><!--
--><!--<AdditionalProviderSettings>waitInterval</AdditionalProviderSettings>--><!--
</MsDeploySourceManifest>
</ItemGroup>
<Message Text="AppPath: $(DeployIisAppPath)" />
</Target>-->
</Project>
Я заметил, что когда я использую MSDeploy, я могу видеть команду, которая выполняется во время публикации:
"C:\Program Files (x86)\IIS\Microsoft Web Deploy V3\msdeploy.exe" -source: манифеста = 'D:\GameBit\API\OBJ\Release\Пакет\API.SourceManifest.xml' -dest: авто, ИмяКомпьютера = "https://192.168.5.50:8172/msdeploy.axd?site=Default", UserName = 'LocalAdmin', пароль = "MyRealPassword", IncludeAcls = 'False', AuthType = 'Basic' -verb: sync -enableRule: EncryptWebConfig -enableRule: EncryptWebConfig -disableLink: AppPoolExtension -disableLink: ContentExtension -disableLink: CertificateExtension -setParamFile: "D:\GameBit\API\obj\Release\Package\API.Publish.Parameters.xml" -allowUntrusted -retryAttempts = 2 -userAgent = "VS12.0: PublishDialog: WTE12.5.60612.0"
Можно ли добавить -postSync:runCommand=""
к этой команде из профиля публикации? Поскольку я нашел на сайте MS, этот параметр позволяет выполнить команду на машине назначения.
EDIT4:
Я нашел информацию о Параметры развертывания веб-развертывания" и настройке postSync, но я не знаю, где его установить, я не хочу редактировать Microsoft.Web.Publishing.targets
из папки MSBuild
Мне нужно выполнить команду на удаленном компьютере после публикации.