11

Mam aplikację internetową wdrożoną na moim lokalnym serwerze IIS pod numerem Sites\Default, działa dobrze i teraz chcę, aby była bezpieczniejsza - chcę szyfrować ciągi połączeń i ustawienia aplikacji .
Wewnątrz plik pubxml Dodałem tę linię:Publikowanie z Visual Studio i automatyczne szyfrowanie ustawień aplikacji przy użyciu aspnet_regiis

<MSDeployEnableWebConfigEncryptRule>true</MSDeployEnableWebConfigEncryptRule> 

ale tylko szyfruje połączeń sznurki. wiem, że mogę ręcznie zadzwonić:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis -pe "appSettings" -site Default -app "/" 

na moim serwerze po wdrożeniu do zaszyfrowania pliku zewnętrznego zawierającego AppSettings, ale muszę to zrobić ręcznie.

Moje pytanie brzmi: jak mogę wdrożyć stronę z Visual Studio (Build> Publish) i czy ta komenda aspnet_regiis zostanie wykonana automatycznie po pomyślnym opublikowaniu.

I found information że mogę użyć runcommand i other about bat files, ale nie wywołuję MSDeploy z wiersza poleceń.
Znalazłem również informacje, że powinienem zbudować dostawcę niestandardowego i zadzwonić do niego z MSDeploy.

Jak mogę edytować mój plik pubxml, aby uzyskać takie zachowanie?

Edit1:
udało mi się zaczepić After Deploy docelowy przy użyciu:

<Target Name="EncryptAppSettings" AfterTargets="MSDeployPublish" > 
    <Message Text="Encrypting appSettings" /> 
    <Exec Command="aspnet_regiis -pe &quot;appSettings&quot; -site Default -app &quot;/&quot;" /> 
    <Message Text="AppPath: $(DeployIisAppPath)" /> 
</Target> 

Ale teraz mam ten błąd:

The command "aspnet_regiis -pe "appSettings" -site Default -app "/"" exited with code 9009.

EDIT2:
mam wypróbowany przy użyciu polecenia runCommand w ten sposób:

<ItemGroup> 
    <MsDeploySourceManifest Include="runCommand"> 
    <path>aspnet_regiis -pe &quot;appSettings&quot; -site Default -app &quot;/&quot;</path> 
    <waitInterval>10000</waitInterval> 
    <AdditionalProviderSettings>waitInterval</AdditionalProviderSettings> 
    </MsDeploySourceManifest> 
</ItemGroup> 

ale nie miałem szczęścia. I found blog o postSync: runCommand, ale chciałbym wywołać to bezpośrednio z VS, więc chciałbym dodać to do opublikowania profilu.

Edit3:
Dodaję mój profil publikuje poniżej:

<?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 &quot;appSettings&quot; -site Default -app &quot;/&quot;" />--><!-- 
    <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> 

Zauważyłem, że gdy używam MSDeploy widzę polecenia, który jest wykonywany podczas rozpatrzenie:

"C:\Program Files (x86)\IIS\Microsoft Web Deploy V3\msdeploy.exe" -source:manifest='D:\GameBit\API\obj\Release\Package\API.SourceManifest.xml' -dest:auto,ComputerName="https://192.168.5.50:8172/msdeploy.axd?site=Default",UserName='LocalAdmin',Password="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"

Czy mogę dodać -postSync:runCommand="" do tego polecenia z profilu publikowania? Jako I found on MS site ten parametr pozwala na wykonanie polecenia na komputerze docelowym.

EDIT4:
znalazłem informacje o Web Deploy Operation Settings i ustawienie postSync, ale nie wiem, gdzie go ustawić, ja nie chce zmieniać Microsoft.Web.Publishing.targets z folderu MSBuild

muszę wykonać polecenie na zdalnym komputerze po pomyślnym opublikowaniu.

+0

Hej, natknąłem się na to przez czystego szczęścia. Może powinieneś usunąć jeden tag i dodać tag "asp.net" do swojego pytania, aby uzyskać więcej ekspozycji? – HamZa

+1

@HamZa dzięki za podpowiedź. Gotowe. – Misiu

+0

Zastosowanie pełna ścieżka do aspnet_regiis i ująć w cudzysłów polecenie '' '' ''. Komenda nie jest poprawnie umieszczona na konsoli (* spróbuj ją wyświetlić i zobacz *) lub nie można nadpisać tego pliku, ponieważ coś blokuje. – SACn

Odpowiedz

6

po przejściu przez swój wszystkich edycji i trochę badań ze mną, chcesz wykonać następującą komendę po publikować z Visual Studio

C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis -pe "appSettings" -site Default -app "/" 

czy zrozumiałem dobrze, można spróbować owijania ItemGroup w cel z AfterTargets zestaw do AddIisSettingAndFileContentsToSourceManifest

<Target Name="executeinHosts" AfterTargets="AddIisSettingAndFileContentsToSourceManifest"> 
    <ItemGroup> 
     <MsDeploySourceManifest Include="runCommand"> 
     //here would be your path that need to run after the publish 
     </MsDeploySourceManifest> 
    </ItemGroup> 
    </Target> 

Więc w twoim przypadku jest to, że część jak powinien wyglądać:

<Target Name="executeinHosts" AfterTargets="AddIisSettingAndFileContentsToSourceManifest"> 
    <ItemGroup> 
     <MsDeploySourceManifest Include="runCommand"> 
     <path>C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis -pe "appSettings" -site $(DeployIisAppPath) -app "/"</path> 
     </MsDeploySourceManifest> 
    </ItemGroup> 
    </Target> 

Informacje dodatkowe:

  • AddIisSettingAndFileContentsToSourceManifest docelowy działa justright przed Web Deploy kopiowanie plików z lokalnego na serwerze.
  • aspnet_regiis można uruchomić w węźle <target> przez <Exec>.

Ex:

<Exec Command="C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -pef connectionStrings $(ProjectDir)obj\Debug\Package\PackageTmp" WorkingDirectory="$(publishUrl)" /> 
+0

Dziękujemy za odpowiedź. Pamiętam, że próbowałem dodać 'MsDeploySourceManifest', ale wewnątrz VS dostałem błąd o przestrzeni nazw' http: // schemas.microsoft.com/developer/msbuild/2003'. Jedno dodatkowe pytanie, czy powinienem umieścić to polecenie w elemencie 'path' wewnątrz' MsDeploySourceManifest' lub czy muszę jakoś uciec? – Misiu

+0

@Misiu, ewentualnie spróbuj ze ścieżką, jeśli to nie trening wymagał sposobu na wykonanie go. – Webruster

+1

Zadziałało. ' C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ aspnet_regiis -pe" appSettings "-domyślność domyślna -app"/"' proszę dodać to do swojej odpowiedzi, aby każdy z podobnym problemem miał działające rozwiązanie. – Misiu

Powiązane problemy