2012-07-31 10 views
8

Ho creato un assembly personalizzato per il mio progetto SSRS.SSRS verifica se l'utente nel gruppo utilizza Custom Assembly

l'assembly personalizzato ha 2 funzioni, IsInGroup e MyTest:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Security.Principal; 

namespace SSRS_Custom_Fuctions 
{ 
    public class Class1 
    { 

     public static bool IsInGroup(string user, string group) 
     { 
      using (var identity = new WindowsIdentity(user)) 
      { 
       var principal = new WindowsPrincipal(identity); 
       return principal.IsInRole(group); 
      } 
     } 

     public static string MyTest() 
     { 
      return "Hello World"; 
     } 
    } 
} 

1) La funzione di base MyTest che restituisce una stringa 'Ciao Mondo' funziona perfettamente bene dal Rapporto utilizzando l'espressione =SSRS_Custom_Functions.Class1.MyTest()

2) La funzione IsInGroup che restituisce un valore booleano non funziona. Questo utilizza lo spazio dei nomi System.Security.Principal per verificare se il nome utente passato alla funzione esiste nel gruppo passato alla funzione. Quando provo a invocare usando espressione =SSRS_Custom_Functions.Class1.IsInGroup(User.User1, "MyGroupName"), il report viene salvataggio con il seguente messaggio di errore:

richiesta di autorizzazione di tipo System.Security fallita

ho modificato i file di configurazione in rssrvpolicy.config il percorso del file ReportingServices e RSPreviewPolicy.config nel percorso del file VisualStudio in base a Microsoft KB920769.

Ho aggiunto un CodeGroup che fornisce FullTrust all'assembly personalizzato.

Di seguito è stato aggiunto l'elemento livello politico:

<CodeGroup class="UnionCodeGroup" 
      version="1" 
      PermissionSetName="FullTrust" 
      Name="SSRS_Custom_Fuctions" 
      Description="Code group for my data processing extension"> 

<IMembershipCondition class="UrlMembershipCondition" 
         version="1" 
         Url="C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies\SSRS_Custom_Fuctions.dll"/> 
</CodeGroup> 

ancora sto ottenendo lo stesso messaggio di errore come sopra.

+2

È necessario controllare i registri, che saranno in .. \ Reporting Services \ LogFiles, forniranno le altre informazioni DLL che devono essere aggiunte al gruppo Code Access Security con autorizzazione FullTrust. In questo potrebbe essere System.Security. – Igoy

risposta

4

Nel proprio assieme, è necessario dichiarare l'oggetto SecurityPermission prima di utilizzarlo.

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Security.Principal; 

namespace SSRS_Custom_Fuctions 
{ 
    public class Class1 
    { 

     public static bool IsInGroup(string user, string group) 
     { 

     System.Security.Permissions.SecurityPermission sp = new System.Security.Permissions.SecurityPermission(System.Security.Permissions.PermissionState.Unrestricted); 
     sp.Assert(); 

      using (var identity = new WindowsIdentity(user)) 
      { 
       var principal = new WindowsPrincipal(identity); 
       return principal.IsInRole(group); 
      } 
     } 

     public static string MyTest() 
     { 
      return "Hello World"; 
     } 
    } 
} 
1

Nella AssemblyInfo il file è necessario aggiungere namespace System.Security e

[assembly: AllowPartiallyTrustedCallers()] . 

Firmare il montaggio con certificato e anche distribuire lo stesso in GAC della macchina.

+0

Questo di per sé non è sufficiente. La soluzione è di dichiarare l'oggetto SecurityPermission. –