Afirmação de permissões em assemblies personalizados

Por padrão, código assembly personalizado roda com o conjunto limitado de permissões de execução . Em alguns casos, você pode querer implementar um assembly personalizado que faça chamadas seguras para recursos protegidos dentro do seu sistema de segurança (como um arquivo ou o registro). Para alcançar isso, você deve tomar as seguintes ações:

  1. Identifique exatamente as permissões que seu código precisa para fazer a chamada segura. Se esse método faz parte de uma biblioteca Microsoft .NET Framework, essas informações devem ser incluídas na documentação do método.

  2. Modificar os arquivos de configuração da política do servidor de relatórios para conceder ao assembly personalizado as permissões necessárias. Para mais informações sobre os arquivos de configuração de políticas de segurança, veja Using Reporting Services Security Policy Files.

  3. Afirme as permissões necessárias como parte do método pelo qual a chamada segura é feita. Isso é necessário porque o código assembly personalizado chamado pelo servidor de relatórios faz parte da assembly host da expressão de relatório, que roda com permissão de execução por padrão. O conjunto de permissões Execução permite que o código seja executado, mas não use recursos protegidos.

  4. Marque a montagem personalizada com AllowPartiallyTrustedCallersAttribute se estiver assinada com um nome forte. Isso é necessário porque assemblies personalizados são chamados a partir de uma expressão de relatório que faz parte da assembly host da expressão de relatório, que, por padrão, não recebe FullTrust; Portanto, é um chamador "parcialmente confiável". Para mais informações, veja Uso de Assemblagens Personalizadas Strong-Named.

Implemente uma Chamada Segura

Você pode modificar os arquivos de configuração de políticas para conceder permissões específicas para seu assembly. Por exemplo, se você estivesse escrevendo um assembly personalizado para lidar com a conversão de moeda, talvez precisasse ler as taxas de câmbio atuais de um arquivo. Para recuperar as informações de taxa, você precisaria adicionar uma permissão de segurança extra, FileIOPermission, ao seu conjunto de permissões para a montagem. Você pode fazer a seguinte entrada adicional no arquivo de configuração da política:

<PermissionSet class="NamedPermissionSet"  
   version="1"  
   Name="CurrencyRatesFilePermissionSet"  
   Description="A special permission set that grants read access to my currency rates file.">  
      <IPermission class="FileIOPermission"  
         version="1"  
         Read="C:\CurrencyRates.xml"/>  
      <IPermission class="SecurityPermission"  
         version="1"  
         Flags="Execution, Assertion"/>  
</PermissionSet>  

Você então adiciona um grupo de código que faz referência a esse conjunto de permissões:

<CodeGroup class="UnionCodeGroup"  
   version="1"  
   PermissionSetName="CurrencyRatesFilePermissionSet"  
   Name="MyNewCodeGroup"  
   Description="A special code group for my custom assembly.">  
   <IMembershipCondition class="UrlMembershipCondition"  
      version="1"  
      Url="C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\MSSQL\Reporting Services\ReportServer\bin\CurrencyConversion.dll"/>  
</CodeGroup>  

Para que seu código obtenha a permissão adequada, você deve afirmar essa permissão dentro do seu código de montagem personalizado. Por exemplo, se você quiser adicionar acesso somente leitura a um arquivo XML, C:\CurrencyRates.xml, você deve adicionar o seguinte código ao seu método:

// C#  
FileIOPermission permission = new FileIOPermission(FileIOPermissionAccess.Read, @"C:\CurrencyRates.xml");  
try  
{  
   permission.Assert();  
   // Load the XML currency rates file  
   XmlDocument doc = new XmlDocument();  
   doc.Load(@"C:\CurrencyRates.xml");  
...  

Você também pode adicionar a assertion como um atributo do método:

[FileIOPermissionAttribute(SecurityAction.Assert, Read=@"C:\CurrencyRates.xml")]  

Para mais informações, veja "Segurança do Framework .NET" no Guia do Desenvolvedor do .NET Framework.