Code Access Security et ASP.net - WebPermission en medium trust.
Code Access Security est un mécanisme qui permet de bloquer certaines méthodes à certaines assemblies en fonction de ses droits, pour en savoir plus, consulter l'article de raptorXP sur le fonctionnement de Code Access Security.
Un site ASP.net est constitué d'assemblies, lorsque IIS exécute un site web il charge ses assemblies, par défaut aucune restriction de sécurité n'est appliqué sur ces assemblies, on dit alors que le site s'exécute en Full trust.
Tout ceci est configuré dans le web.config global, par défaut :
<location allowOverride="true">
<system.web>
<securityPolicy>
<trustLevel name="Full" policyFile="internal" />
<trustLevel name="High" policyFile="web_hightrust.config" />
<trustLevel name="Medium" policyFile="web_mediumtrust.config" />
<trustLevel name="Low" policyFile="web_lowtrust.config" />
<trustLevel name="Minimal" policyFile="web_minimaltrust.config" />
</securityPolicy>
<trust level="Full" originUrl="" />
</system.web>
</location>
Dans cette configuration le site web possède tous les droits, il n'y a aucune restriction effectué par .net, la seule restriction se situe au niveau du compte exécutant ASP.net, généralement le compte aspnet.
On modifie rarement ces sécurités lorsque l'on est propriétaire du serveur mais dans le cas d'un hébergement mutualisé, pour des raisons de sécurités le site web est souvent en Medium trust aussi appelé Partial trust.
Le fichier de configuration racine devient alors :
<location allowOverride="false">
<system.web>
<securityPolicy>
<trustLevel name="Full" policyFile="internal" />
<trustLevel name="High" policyFile="web_hightrust.config" />
<trustLevel name="Medium" policyFile="web_mediumtrust.config" />
<trustLevel name="Low" policyFile="web_lowtrust.config" />
<trustLevel name="Minimal" policyFile="web_minimaltrust.config" />
</securityPolicy>
<trust level="Medium" originUrl="" />
</system.web>
</location>
Dans le cas de la configuration d'un serveur mutualisé, attention à ne pas oublier le allowOverride="false", sinon les sites webs pourront se remettre en Full Trust.
Pour savoir ce que le Medium trust implique il faut regarder dans le fichier web_mediumtrust.config, c'est ce fichier qui contient les jeux de permissions. Cet article montre un tableau récapitulant les différentes permissions en fonction des trust level : How To: Use Code Access Security in ASP.NET 2.0.
Voici les principales permissions apporté par .net. Bien sur, si vous avez le courage vous pouvez créer vos propres permissions :
![Aa302425.f09thcm01(en-us,MSDN.10)[1]](http://blogs.codes-sources.com/blogs/cyril/WindowsLiveWriter/8438136214ed_C82D/Aa302425.f09thcm01(en-us,MSDN.10)%5B1%5D_thumb.gif)
Source : Using Code Access Security with ASP.NET
L'une des permissions les plus pénibles en Medium Trust est la WebPermission. En effet cette permission ne permet pas de faire des requêtes vers d'autres serveurs, il ne vous est alors impossible d'appeler des WebServices, de lire des RSS, ...
<IPermission
class="WebPermission"
version="1">
<ConnectAccess>
<URI uri="$OriginHost$"/>
</ConnectAccess>
</IPermission>
Lorsque vous essayez d'accéder à l'extérieur, par exemple un flux RSS, vous tombez alors sur cette erreur :
Stack Trace:
[SecurityException: Request for the permission of type 'System.Net.WebPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.]
System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet) +0
System.Security.CodeAccessPermission.Demand() +59
System.Net.HttpWebRequest..ctor(Uri uri, ServicePoint servicePoint) +166
System.Net.HttpRequestCreator.Create(Uri Uri) +26
System.Net.WebRequest.Create(Uri requestUri, Boolean useUriBase) +373
System.Net.WebRequest.Create(Uri requestUri) +28
Si, pour des raisons de sécurité, vous avez configuré votre site en medium trust et vous voulez appeler une seule url bien définit, par exemple l'adresse d'un WebService, vous pouvez créer un nouveau modèle de sécurité se basant sur le medium trust et rajouté une entrée dans le ConnectAccess.
<IPermission
class="WebPermission"
version="1">
<ConnectAccess>
<URI uri="$OriginHost$"/>
<URI uri="http://blogs.developpeur.org/cyril/rss.aspx" />
</ConnectAccess>
</IPermission>
Si vous voulez autoriser tout un domaine vous pouvez utiliser une expression régulière (j'ai pas trouvé de doc là dessus, si quelqu'un a je suis preneur)
<IPermission
class="WebPermission"
version="1">
<ConnectAccess>
<URI uri="$OriginHost$"/>
<URI uri="http://blogs.developpeur.org/.*" />
</ConnectAccess>
</IPermission>
Malheureusement, lorsque l'on a un hébergement mutualisé on n'a pas accès à ces fichiers de config, l'hébergeur ne va pas rajouter une entrée pour chaque hébergement. La solution consiste à désactiver cette permission, cela se fait en utilisant l'attribut Unrestrictited="true".
<IPermission
class="WebPermission"
version="1"
Unrestricted="true" />
Avec cette permission ASP.net ne bloquera plus les requêtes vers l'extérieur.