Il blog di Giuseppe Marchi - SharePoint MVP
NAVIGATION - SEARCH

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="" />
Per permettere quindi alle vostre Web Part di utilizzare il modello ad oggetti di Sharepoint, e per definire degli specifici permessi, propri solamente per il vostro assembly, vi conviene creare un nuovo file di configurazione personalizzato.
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"
/>
Queste sotto l'elemento <NamedPermissionSet>, ma prima della difinizione dei permessi per ASP.Net:

<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>
Ed infine, assegnare i permessi defini, al proprio assembly:


<CodeGroup class="UnionCodeGroup"
version="1"
PermissionSetName="MyCustomPermissions"
>
<IMembershipCondition class="StrongNameMembershipCondition"
version="1.0.0.0"
PublicKeyBlob="..."
Name="Peppe.WebParts"
/>
</CodeGroup>
Il valore da dare all'attributo PublicKeyBlog, lo potete generare tramite l'utility secutil, utilizzata in questo modo: c:\>secutil -hex -s yourAssembly.dll.
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/.*" />
In questo modo nelle vostre web part potrete sia utilizzare il modello ad oggetti di Sharepoint, che fare delle operazioni di IO, che effettuare delle richieste HTTP. Una volta fatte queste modifiche al livello di sicurezza del proprio assembly (perchè in pratica è stato cambiato solo quello ... e non quello proprio di Sharepoint), dovete effettuare un IISRESET per applicare effettivamente le modifiche.
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"
/>
Il valore da dare all'attributo PublicKetyToken lo potete generare, invece, tramite l'utility sn.exe: c:\>sn -T yourAssembly.dll
blog comments powered by Disqus