Custom Trust Level per utilizzare l'object model nelle web part
Con Visual Studio .NET è possibile, con facilità, personalizzare portal o sites di Sharepoint creando delle proprie Web Part. Il problema sorge quando, per creare funzionalità più complesse, vorrete accedere al modello ad oggetti di Sharepoint, tramite le relative API; magari potrete aver il bisogno di aggiungere dei nuovi elementi in una lista o leggerne il contenuto via codice, oppure semplicemente, vorrete implementare delle web part che effettuino delle operazioni di IO su file, o delle richieste HTTP.
Bene, è tutto possibile, ma, facendo delle prove con il livello di sicurezza di default definito da Sharepoint, vi trovere di fronte ad un errore di questo genere:
Request for the permission of type Microsoft.SharePoint.Security.SharePointPermission, Microsoft.SharePoint.Security, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c failed
Ciò accade perchè il web.config principale (posto sotto la directory C:/intetpub/wwwroot), è configurato in modo tale da andare a prelevare le specifiche di sicurezza da un preciso file di configurazione. Infatti al suo interno troverete queste righe:
<securityPolicy>
<trustLevel name="WSS_Medium"
policyFile="C:\Program Files\Common Files\Microsoft Shared
Web Server Extensions\60\config\wss_mediumtrust.config" />
<trustLevel name="WSS_Minimal"
policyFile="C:\Program Files\Common Files\Microsoft Shared
Web Server Extensions\60\config\wss_minimaltrust.config" />
</securityPolicy>
...
<trust level="WSS_minimal" originUrl="" />
Potete dunque copiare il file wss_minimaltrust.config in un nuovo file (che io ho chiamato myCustomPolicy.config) ed aggiungere queste righe, sotto l'elemento <SecurityClasses>:
<SecurityClass Name="SharePointPermission"
Description="Microsoft.SharePoint.Security.SharePointPermission,
Microsoft.SharePoint.Security,
Version=11.0.0.0, Culture=neutral,
PublicKeyToken=71e9bce111e9429c"/>
<SecurityClass Name="EnvironmentPermission"
Description="System.Security.Permissions.EnvironmentPermission,
mscorlib, Version=1.0.5000.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089"/>
<SecurityClass Name="DirectoryServicesPermission"
Description="System.DirectoryServices.DirectoryServicesPermission,
System.DirectoryServices,
Version=1.0.5000.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a"/>
<SecurityClass Name="DnsPermission"
Description="System.Net.DnsPermission, System,
Version=1.0.5000.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089"/>
<SecurityClass Name="WebPermission"
Description="System.Net.WebPermission, System,
Version=1.0.5000.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089"/>
<SecurityClass Name="FileIOPermission"
Description="System.Security.Permissions.FileIOPermission,
mscorlib, Version=1.0.5000.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089"/>
<PermissionSet class="NamedPermissionSet"
version="1"
Name="MyCustomPermissions">
<IPermission class="AspNetHostingPermission"
version="1" Level="High"
/>
<IPermission class="SecurityPermission"
version="1"
Flags="Execution,UnmanagedCode,ControlPrincipal"
/>
<IPermission class="WebPartPermission"
version="1" Connections="True" Unrestricted="True"
/>
<IPermission class="SharePointPermission"
version="1" ObjectModel="True" Unrestricted="True"
/>
<IPermission class="WebPermission"
version="1" Unrestricted="True">
<ConnectAccess>
<URI uri="$OriginHost$"/>
<URI uri="http://serverName/.*"/>
<URI uri="http://serverName/"/>
</ConnectAccess>
</IPermission>
<IPermission class="DnsPermission"
version="1" Unrestricted="True"
/>
<IPermission class="FileIOPermission"
version="1"
Read="$AppDir$" PathDiscovery="$AppDir$"
/>
<IPermission class="EnvironmentPermission"
version="1" Unrestricted="true"
/>
</PermissionSet>
<CodeGroup class="UnionCodeGroup"
version="1"
PermissionSetName="MyCustomPermissions">
<IMembershipCondition class="StrongNameMembershipCondition"
version="1.0.0.0"
PublicKeyBlob="..."
Name="Peppe.WebParts"
/>
</CodeGroup>
Fatto questo dovete solamente andare a modificare il vostro web config, aggiungendo :
<trustLevel name="MyCustomLevel"
policyFile="C:\Program Files\Common Files\Microsoft Shared
Web Server Extensions\60\config\MyCustomPolicy.config" />
...
<trust level="MyCustomLevel" originUrl="http://serverName/.*" />
Io ci ho messo tanto per capire come funziona questo meccanismo, e Sharepoint sicuramente non mi ha dato un mano ... spero che possa essere utile a qualcuno tutto sto papiro !!
Update: Mi sono scordato di scrivere che insieme al nuovo livello di sicurezza, nel web.config va aggiunto anche il riferimento al proprio assembly, in questo modo:
<SafeControl Assembly="Peppe.WebParts, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=..."
Namespace="Microsys.WebParts" TypeName="*" Safe="True" />