Personnaliser le WebDeploy

WebDeploy est un outil dans Visual Studio permettant de compiler puis déployer un projet web sur un serveur IIS. Il est très simple d’usage mais… la personnalisation est inexistante.

Compte tenu de la complexité du processus de build des projets .NET et de la qualité de la documentation fournit, ça n’a pas été évident mais j’ai pu finalement cracher ce bout de XML. Il est à ajouter dans le fichier csproj du projet web à la fin.

Voici ce qu’il fait :

  1. On renseigne en paramètre l’exécutable signtool, qui permet de signer numériquement un fichier PE (ça correspond à l’onglet « Signatures numériques » dans les propriétés d’un fichier signé
  2. On renseigne le certificat à utiliser par sa somme de contrôle SHA1
  3. On indique avec un nom de variable particulier le fichier snk contenant les clés pour ajouter un nom fort aux assemblies. Les variables sont KeyOriginatorFile  et _FullKeyFile  et sont reconnus par le processus de compilation.
  4. Après la compilation normale du projet, on signe le fichier *.dll  et les fichiers *.ressources.dll généré par le projet web
  5. Après l’étape 4, on lance la cible MvcBuildViews qui va compiler toutes les vues dans une assembly qui se nomme {nom du projet web}.WebUI.dll. Une fois que c’est fait, on signe également la nouvelle assembly et ses ressources.
  6. Le processus normal reprend et pousser le résultat sur le serveur IIS
<PropertyGroup Condition="Exists('C:\Users\veovis')">
 <Sha1Thumbnail>6b30be2f5fd6cb22225191b803c9232755dc07b8</Sha1Thumbnail>
 <SignAssembly>true</SignAssembly>
 <SignToolLocation>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\signtool.exe</SignToolLocation>
 <AssemblyOriginatorKeyFile>C:\Users\sebastien\Documents\Security\euphor.snk</AssemblyOriginatorKeyFile>
 <_FullKeyFile>$(AssemblyOriginatorKeyFile)</_FullKeyFile>
 <KeyOriginatorFile>$(AssemblyOriginatorKeyFile)</KeyOriginatorFile>
 <DelaySign>false</DelaySign>
 <OnAfterCopyAllFilesToSingleFolderForPackage>
MvcBuildViews;
 </OnAfterCopyAllFilesToSingleFolderForPackage>
</PropertyGroup>
<Target Name="AfterBuild" Condition=" '$(Configuration)' == 'Release' And '$(SignToolLocation)' != ''">
 <ItemGroup>
 <OutputFiles Include="$(TargetPath)"/>
 <OutputFiles Include="$(TargetDir)\*\$(TargetFileName).resources.dll" />
 </ItemGroup>
 <Exec Command="&quot;$(SignToolLocation)&quot; sign /sha1 $(Sha1Thumbnail) /tr &quot;http://www.startssl.com/timestamp&quot; /ph &quot;%(OutputFiles.FullPath)&quot;" />
</Target>
<Target Name="MvcBuildViews">
 <RemoveDir Directories="$(_PackageTempDir)2" />
 <AspNetCompiler VirtualPath="temp" PhysicalPath="$(_PackageTempDir)" Force="true" Updateable="false" FixedNames="true" TargetPath="$(_PackageTempDir)2" />
 <AspNetMerge ExePath="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools" Nologo="true" SingleAssemblyName="$(TargetName).WebUI" ApplicationPath="$(_PackageTempDir)2" CopyAttributes="true" AssemblyInfo="$(TargetPath)" KeyFile="$(_FullKeyFile)" />
 <ItemGroup>
 <DllFiles Include="$(_PackageTempDir)2\bin\$(TargetName).WebUI.dll" />
 <DllFiles Include="$(_PackageTempDir)2\bin\*\$(TargetName).WebUI.resources.dll" />
 </ItemGroup>
 <Exec Command="&quot;$(SignToolLocation)&quot; sign /sha1 $(Sha1Thumbnail) /tr &quot;http://www.startssl.com/timestamp&quot; /ph &quot;%(DllFiles.FullPath)&quot;" />
 <RemoveDir Directories="$(_PackageTempDir)" />
 <Exec Command="rename &quot;$(_PackageTempDir)2&quot; &quot;PackageTmp&quot;" />
</Target>

Toutes ces étapes ne sont évidemment pas obligatoires et ce fichier DOIT être personnalisé en fonction de son environnement.