Usando a Segurança do Acesso ao Código com o ASP.NET

Atualizado em: 21 de Maio de 2004
Nesta página
Neste móduloNeste módulo
ObjetivosObjetivos
AplicaçãoAplicação
Como usar este móduloComo usar este módulo
Visão geralVisão geral
Acesso a recursosAcesso a recursos
Confiança total e confiança parcialConfiança total e confiança parcial
Configurando a segurança de acesso ao código no ASP.NETConfigurando a segurança de acesso ao código no ASP.NET
Arquivos de diretivas do ASP.NETArquivos de diretivas do ASP.NET
Diretiva do ASP.NETDiretiva do ASP.NET
Desenvolvendo aplicativos da Web parcialmente confiáveisDesenvolvendo aplicativos da Web parcialmente confiáveis
Níveis de confiançaNíveis de confiança
Abordagens de aplicativos da Web parcialmente confiáveisAbordagens de aplicativos da Web parcialmente confiáveis
Personalizar a diretivaPersonalizar a diretiva
Código privilegiado no modo de segurançaCódigo privilegiado no modo de segurança
Decidindo a abordagem que será adotadaDecidindo a abordagem que será adotada
Confiança MédiaConfiança Média
Restrições do modo de confiança médiaRestrições do modo de confiança média
ResumoResumo
Outros recursosOutros recursos

Neste módulo

A segurança de acesso ao código é um modelo de restrição de recursos que permite aos administradores determinar se e como um certo código é capaz de acessar recursos especificados e realizar outras operações privilegiadas. Este módulo concentra–se na configuração da diretiva de segurança de acesso ao código do ASP.NET e mostra como superar alguns dos principais obstáculos que podem ser encontrados no desenvolvimento de aplicativos da Web parcialmente confiáveis.

Os elementos práticos da segurança de acesso ao código serão explicados detalhadamente, e você aprenderá como desenvolver aplicativos da Web de média confiabilidade que se beneficiam da proteção de segurança proporcionada pela segurança de acesso ao código, mas que ainda são capazes de usar componentes que exigem confiabilidade total.

O módulo também apresenta informações sobre como criar diretivas confiáveis do ASP.NET e contém duas listas valiosíssimas:

Os conjuntos do sistema que têm o APTCA (AllowPartiallyTrustedCallersAttribute) aplicado.

As permissões de diretiva e níveis de confiança padrão do ASP.NET. Este padrão especifica quais as principais restrições impostas por cada nível de confiança ASP.NET.

Início da páginaInício da página

Objetivos

Use este módulo para:

Aprender como funcionam os arquivos de diretivas do ASP.NET e como criar uma diretiva personalizada.

Desenvolver aplicativos da Web parcialmente confiáveis.

Utilizar o OLE DB, o log de eventos, os Web Services e o Registro a partir de aplicativos da Web parcialmente confiáveis.

Colocar códigos privilegiados no modo seguro.

Saber quando usar o modo seguro e quando personalizar as diretivas de confiança do ASP.NET que já existem.

Início da páginaInício da página

Aplicação

Este módulo aplica–se aos produtos e tecnologias a seguir:

Microsoft® Windows® 2000 Server e Microsoft Windows Server™ 2003

Microsoft .NET Framework 1.1 e ASP.NET 1.1

Início da páginaInício da página

Como usar este módulo

Este módulo não trata dos fundamentos da segurança de acesso ao código. Pressupõe–se um certo conhecimento prévio, embora os conceitos principais sejam reiterados quando for necessário. Para obter mais informações sobre a segurança de acesso ao código do .NET Framework, consulte, "Segurança do Acesso ao Código na Prática".

Use este módulo para aprender como usar a segurança de acesso ao código para bloquear os seus aplicativos da Web e tornar o seu servidor mais resistente a ataques potenciais.

Se você gerencia ambientes de hospedagem compartilhados ou trabalha em um ISP (Provedor de Serviços de Internet) que executa vários aplicativos de diferentes empresas no mesmo servidor da Web, pode usar a segurança de acesso ao código para:

Isolar os aplicativos entre si.
Por exemplo, a segurança de acesso ao código pode ser usada para garantir que um aplicativo da Web não possa gravar nos diretórios de outro aplicativo da Web.

Isolar aplicativos de recursos do sistema.
Por exemplo, a segurança de acesso ao código pode restringir o acesso ao sistema de arquivos, ao registro, aos logs de eventos e a recursos de rede, além de outros recursos do sistema.

Observe também que o Windows Server 2003 e o IIS 6.0 (Internet Information Services) proporcionam ainda mais isolamento de processos para aplicativos da Web. O isolamento de processos aliado à segurança de acesso ao código é o modelo recomendado para o isolamento de aplicativos.

Para obter mais informações, consulte, "Hospedando Vários Aplicativos da Web".

Início da páginaInício da página

Visão geral

A segurança tradicional baseada em objetos de segurança, como a que é oferecida pelo sistema operacional, autoriza o acesso aos recursos com base na identidade do usuário.

Com o Microsoft .NET Framework versão 1.1, os administradores podem configurar diretivas para aplicativos da Web e Web Services ASP.NET, que podem consistir em vários conjuntos. Elas também podem conceder permissões de segurança de acesso ao código para permitir que o aplicativo tenha acesso a tipos específicos de recursos e possa realizar operações privilegiadas específicas.

Por exemplo:

Um administrador pode decidir que o código baixado da Internet não deve ter permissão de acessar nenhum recurso, enquanto códigos de aplicativos da Web desenvolvidos por uma determinada empresa devem receber um nível mais alto de confiança e, por exemplo, poder acessar o sistema de arquivos, o log de eventos, e os bancos de dados Microsoft SQL Server.

Programas iniciados por um administrador local não têm limitações na máquina local. Infelizmente, se a identidade do administrador for falsificada e um usuário conseguir executar códigos utilizando o contexto de segurança do administrador, o usuário mal–intencionado também não terá nenhuma restrição.

Essas áreas estão onde a segurança de acesso ao código é importante, pois ela pode estabelecer outras restrições além da segurança com base no próprio código, e não no usuário que está executando o código.

Obervação Os aplicativos da Web e os Web Services criados com o .NET Framework versão 1.0 sempre funcionam com permissões totais de acesso ao código. Isso não pode ser configurado.

Início da páginaInício da página

Acesso a recursos

Todo o acesso aos recursos a partir dos aplicativos ASP.NET e de códigos gerenciados em geral está sujeito às duas camadas de segurança seguintes:

Segurança de acesso ao código. Essa camada de segurança verifica se todo o código na pilha de chamadas atual até o código de acesso aos recursos, inclusive, está autorizado a acessar o recurso. O administrador usa a diretiva de segurança de acesso ao código para conceder permissões a conjuntos. As permissões determinam exatamente quais tipos de recursos o conjunto poderá acessar. Vários tipos de permissões correspondem aos diferentes tipos de recursos que podem ser acessados. Esses tipos são o sistema de arquivos, o Registro, o log de eventos, os serviços de diretório, o Microsoft SQL Server™, fontes de dados OLE DB e recursos de rede.
Para ver uma lista completa das permissões de acesso ao código, consulte, "Segurança do Acesso ao Código na Prática".

Segurança do sistema operacional/plataforma. Esta camada de segurança verifica se o contexto de segurança do segmento solicitante pode ter acesso ao recurso. Se o segmento estiver representando, será usado o símbolo de representação do segmento. Caso contrário, o identificador do processo será usado e comparado com a ACL (Lista de Controle de Acesso) anexa ao recurso para determinar se a operação solicitada pode ou não ser realizada e se o recurso pode ou não ser acessado.

Ambas as verificações devem ser bem–sucedidas para que o recurso seja acessado com êxito. Todos os tipos de recurso expostos pelas classes do .NET Framework são protegidos por permissões de acesso ao código. A Figura 9.1 mostra uma série de tipos comuns de recursos que são acessados por aplicativos da Web, além da permissão de acesso ao código associada necessária para a tentativa de acesso ser bem–sucedida.

Tipos comuns de recurso acessados por aplicativos da Web ASP.NET e tipos de permissões associados

Figura 9.1
Tipos comuns de recurso acessados por aplicativos da Web ASP.NET e tipos associados de permissões

Início da páginaInício da página

Confiança total e confiança parcial

Por padrão, os aplicativos da Web funcionam com confiança total. Os aplicativos de confiança total recebem permissões irrestritas de acesso ao código da diretiva de segurança de acesso ao código. Essas permissões são as permissões internas de sistema e as permissões personalizadas. Isso significa que a segurança de acesso ao código não impedirá que o seu aplicativo acesse qualquer um dos tipos protegidos de recursos mostrados na Figura 9.1. O sucesso ou o fracasso da tentativa de acesso ao recurso é determinado simplesmente pela segurança no nível de sistema operacional. Os aplicativos da Web que funcionam com confiança total são todos os aplicativos ASP.NET criados por meio do .NET Framework versão 1.0. Por padrão, os aplicativos criados com o .NET Framework versão 1.1 funcionam com confiança total, mas o nível de confiança pode ser configurado com o elemento <trust>, descrito mais adiante neste módulo.

Se um aplicativo for configurado com um nível de confiança que não seja "Total", ele será denominado aplicativo parcialmente confiável. Os aplicativos parcialmente confiáveis têm permissões restritas, o que limita a sua capacidade de acessar recursos protegidos.

Importante: aplicativos da Web criados com o .NET Framework versão 1.0 sempre funcionam com confiança total, pois os tipos do System.Web exigem chamadores com confiança total.

Início da páginaInício da página

Configurando a segurança de acesso ao código no ASP.NET

Por padrão, os aplicativos da Web que funcionam com confiança total não têm qualquer restrição de permissões. Para modificar os níveis de confiança da segurança de acesso ao código no ASP.NET, você precisa estabelecer um parâmetro no Machine.config ou no Web.config e configurar o aplicativo como um aplicativo parcialmente confiável.

Configurando os níveis de confiança

O elemento <trust> em Machine.config controla se a segurança de acesso ao código será ativada ou não para um aplicativo da Web. Abra Machine.config, procure "<trust>", e você verá o seguinte.

  <system.web> 
     <!-- level="[Full|High|Medium|Low|Minimal]" --> 
     <trust level="Full" originUrl=""/> 
  </system.web> 

Com o nível de confiança definido como "Full", a segurança de acesso ao código é efetivamente desativada porque nenhuma exigência de permissões fica no caminho das tentativas de acesso aos recursos. Esta é a única opção para os aplicativos da Web ASP.NET criados com o .NET Framework versão 1.0. Descendo na lista de "Full" até "Minimal", cada nível retira mais permissões, restringindo ainda mais a capacidade do seu aplicativo de acessar recursos protegidos e realizar operações privilegiadas. Conforme o nível, maior será o isolamento do aplicativo. A Tabela 9.1 mostra os níveis de confiança predefinidos e indica as principais restrições em relação ao nível anterior.

Tabela 9.1 Restrições impostas pelos níveis de confiança do ASP.NET

Nível de confiança do ASP.NETPrincipais restrições

Full

Permissões irrestritas. Os aplicativos podem acessar qualquer recurso que esteja sujeito à segurança do sistema operacional. Todas as operações privilegiadas são permitidas.

Elevado

Não chama código não gerenciado.
Não chama componentes de serviço.
Não grava eventos de log.
Não acessa filas do Microsoft Message Queuing.
Não acessa fontes de dados OLE DB.

Média

Além do que já foi citado, o acesso aos arquivos é restrito à diretiva do aplicativo atual e o acesso ao registro não é permitido.

Acessível

Além do que já foi citado, o aplicativo não é capaz de conectar–se ao SQL Server e o código não pode chamar o CodeAccessPermission.Assert (nenhuma permissão de segurança de declaração).

Mínimo

Apenas a permissão de execução está disponível.

Bloqueando o nível de confiança

Se o administrador do servidor de Web quiser usar a segurança de acesso ao código para garantir o isolamento do aplicativo e restringir o acesso aos recursos do sistema, ele pode definir a diretiva de segurança da máquina e impedir que aplicativos individuais a substituam.

Provedores de serviços de aplicativo ou qualquer outro responsável pela execução de vários aplicativos da Web no mesmo servidor devem bloquear o nível de confiança de todos os aplicativos da Web. Para isso, delimite o elemento <trust> em Machine.config com uma marca <location> e defina o atributo allowOverride como false, como mostra o exemplo a seguir.

<location allowOverride="false"> 
  <system.web> 
    <!-- level="[Full|High|Medium|Low|Minimal]" --> 
    <trust level="Medium" originUrl=""/> 
 </system.web> 
</location> 

Você também pode usar um atributo path no elemento <location> para aplicar uma configuração a um site ou aplicativo da Web específico que não possa ser substituído. Para obter mais informações sobre o elemento <location>, consulte, "Protegendo seus Aplicativos ASP.NET e Web Services".

Início da páginaInício da página

Arquivos de diretivas do ASP.NET

Cada nível de confiança é ligado a um arquivo de diretiva XML individual, o qual lista o conjunto de permissões concedidos por cada nível de confiança. Os arquivos de diretivas encontram–se no seguinte diretório:

%windir%\Microsoft.NET\Framework\{versão}\CONFIG 

Os níveis de confiança são direcionados aos arquivos de diretivas pelos elementos <trustLevel> em Machine.config, que se encontram logo acima do elemento <trust>, como mostra o exemplo a seguir.

<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> 
    <!-- level="[Full|High|Medium|Low|Minimal]" --> 
    <trust level="Full" originUrl=""/> 
  </system.web> 
</location> 

Observação: não há nenhum arquivo de diretivas para o nível de confiança total. Esse é um caso especial que simplesmente indica o conjunto irrestrito de todas as permissões.

A diretiva do ASP.NET é totalmente configurável. Além dos níveis padrão de diretivas, os administradores podem criar arquivos personalizados de permissões e configurá–los por meio do elemento <trust>, que será descrito mais adiante neste módulo. O arquivo de diretivas associado ao nível personalizado também precisa ser definido por um elemento <trustLevel> no Machine.config.

Início da páginaInício da página

Diretiva do ASP.NET

A diretiva de segurança de acesso ao código é hierárquica, sendo administrada em vários níveis. A diretiva pode ser criada para os níveis de domínio de empresa, máquina, usuário e aplicativo. A diretiva de segurança de acesso ao código do ASP.NET é um exemplo da diretiva de domínio de aplicativo.

Os parâmetros de um arquivo de configuração XML separado definem a diretiva para cada nível. As diretivas de empresa, máquina e usuário podem ser configuradas por meio da ferramenta de configuração do Microsoft .NET Framework, mas os arquivos de diretivas do ASP.NET devem ser editados manualmente por meio de um editor XML ou de texto.

Cada arquivo de diretiva de nível de confiança do ASP.NET diz quais permissões podem ser concedidas aos aplicativos configurados em um determinado nível de confiança. As permissões reais concedidas a um aplicativo ASP.NET são determinadas pela intersecção das permissões concedidas em todos os níveis de diretivas, inclusive empresa, máquina, usuário e na diretiva do (domínio do aplicativo) ASP.NET.

Como a diretiva é avaliada desde o nível superior (empresa) até o nível inferior (aplicativo ASP.NET), não é possível conceder permissões, apenas negá–las. Você não pode incluir uma permissão no ASP.NET sem que antes um nível superior conceda a permissão. Essa abordagem garante que o administrador corporativo sempre tenha a palavra final e que códigos mal–intencionados executados em um domínio de aplicativo não consigam solicitar e receber mais permissões que os configurados pelo administrador.

Para obter mais informações sobre a avaliação de diretivas, consulte o, "Segurança do Acesso ao Código na Prática."

Um arquivo de diretivas do ASP.NET por dentro

Para ver quais permissões são definidas por um determinado nível de confiança, abra o arquivo de diretivas em questão no Bloco de Notas ou (de preferência) em um editor de XML e localize o "ASP.NET" denominado conjunto de permissões. Esse conjunto de permissões lista as permissões configuradas para o aplicativo no nível de confiança atual.

Observação: você também verá os conjuntos de permissão "FullTrust" e "Nothing". Esses conjuntos não contêm nenhum elemento de permissão porque "FullTrust" implica todas as permissões e "Nothing" não contém nenhuma permissão.

O fragmento a seguir mostra os principais elementos de um arquivo de diretivas ASP.NET:

<configuration> 
    <mscorlib> 
        <security> 
            <policy> 
                <PolicyLevel version="1"> 
                    <SecurityClasses> 
                      ... list of security classes, permission types,  
                        and code group types ... 
                    </SecurityClasses> 
                    <NamedPermissionSets> 
                      <PermissionSet Name="FullTrust" ... /> 
                      <PermissionSet Name="Nothing" .../> 
                      <PermissionSet Name="ASP.NET" ... 
                        ... This is the interesting part ... 
                        ... List of individual permissions... 
                            <IPermission  
                                    class="AspNetHostingPermission" 
                                    version="1" 
                                    Level="High" /> 
                            <IPermission 
                                    class="DnsPermission" 
                                    version="1" 
                                    Unrestricted="true" /> 
                          ...Continued list of permissions... 
                      </PermissionSet> 
                </PolicyLevel version="1"> 
            </policy> 
        </security> 
    </mscorlib> 
</configuration> 

Observe que cada permissão é definida por um elemento <IPermission>, que define o nome do tipo de permissão, a versão e se ela está ou não no estado irrestrito.

Estado de permissão e permissões irrestritas

Muitas permissões possuem um estado, usado para o ajuste fino dos direitos de acesso especificados pela permissão. O estado determina exatamente o que a permissão permite que o seu aplicativo faça. Por exemplo, FileIOPermission pode especificar um diretório e um tipo de acesso (leitura, gravação, e assim por diante). A permissão a seguir exige que o código de chamada receba a permissão de leitura para acessar o diretório C:\SomeDir:

(new FileIOPermission(FileIOPermissionAccess.Read, @"C:\SomeDir")).Demand(); 

No seu estado irrestrito, FileIOPermission permite qualquer tipo de acesso a qualquer área do sistema de arquivos (naturalmente, a segurança do sistema operacional ainda é válida). A permissão a seguir exige que o código de chamada receba a FileIOPermission irrestrita:

(new FileIOPermission(PermissionState.Unrestricted)).Demand(); 

Conjunto de permissões nomeado ASP.NET

Os arquivos de diretivas ASP.NET contêm um conjunto de permissões nomeado "ASP.NET". Esse conjunto define o conjunto de permissões concedido pela diretiva do domínio do aplicativo aos aplicativos associados.

A diretiva ASP.NET também introduz uma AspNetHostingPermission personalizada, que possui um atributo Level associado correspondente a um dos níveis padrão. Todos os tipos públicos em System.Web e em System.Web.Mobile são protegidos por exigências do nível Mínimo desta permissão. Essa estratégia de redução de riscos foi criada para garantir que o código do aplicativo da Web não possa ser usado em outros ambientes parcialmente confiáveis sem uma configuração específica de diretiva feita pelo administrador.

Parâmetros de substituição

Se você editar um dos arquivos de diretivas ASP.NET, perceberá que alguns dos elementos de permissão contêm parâmetros de substituição ($AppDirUrl$, $CodeGen$ e $Gac$). Esses parâmetros permitem que você configure as permissões a conjuntos que fazem parte do seu aplicativo da Web, mas que são carregados de lugares diferentes. Cada parâmetro de substituição é substituído por um valor real no momento da avaliação da diretiva de segurança. Isso ocorre quando o seu conjunto de aplicativos da Web é carregado pela primeira vez. O seu aplicativo da Web pode consistir nos três tipos de conjunto a seguir:

Conjuntos particulares, compilados no tempo da criação e instalados no diretório bin do aplicativo

Importante: esse tipo de conjunto não pode ter um nome de alta segurança. Conjuntos com nomes de alta segurança usados por aplicativos da Web ASP.NET devem ser instalados no cache de conjunto global. Essa restrição se faz necessária devido ao funcionamento interno do processo do operador do domínio de vários aplicativos.

Conjuntos compilados dinamicamente que são gerados em resposta a uma solicitação de página

Conjuntos compartilhados que são carregados do cache de conjunto global do computador

Cada um desses tipos de conjuntos possui um parâmetro de substituição associado, conforme resume a Tabela 9.2.

Tabela 9.2 Parâmetros de substituição da diretiva de segurança de acesso ao código ASP.NET

ParâmetroRepresenta

$AppDirUrl$

O diretório raiz virtual do aplicativo. Isso permite a aplicação das permissões ao código localizado no diretório bin do aplicativo. Por exemplo, se um diretório virtual for ligado a C:\YourWebApp, $AppDirUrl$ será igual a C:\YourWebApp.

$CodeGen$

O diretório que contém conjuntos gerados dinamicamente (por exemplo, o resultado de compilações de páginas .aspx). Isto pode ser configurado individualmente por aplicativo, e assume o valor padrão
%windir%\Microsoft.NET\Framework\{version}\Temporary ASP.NET Files.
$CodeGen$ permite a aplicação de permissões a conjuntos gerados dinamicamente.

$Gac$

Qualquer conjunto que seja instalado no GAC (Cache de Conjunto Global) do computador (%windir%\assembly). Isso permite a concessão de permissões a conjuntos com nomes de alta segurança carregados do GAC pelo aplicativo da Web.

Início da páginaInício da página

Desenvolvendo aplicativos da Web parcialmente confiáveis

Os aplicativos da Web parcialmente confiáveis são aplicativos que não têm confiança total e contam com um conjunto restrito de permissões de acesso ao código, determinado pela diretiva de segurança de acesso ao código. O resultado disso é que os aplicativos parcialmente confiáveis são limitados na sua capacidade de acessar recursos protegidos e executar outras operações privilegiadas. Certas permissões são negadas aos aplicativos parcialmente confiáveis, portanto os recursos que exigem essas permissões não poderão ser acessados diretamente. Outras permissões são concedidas com restrições, de forma que os recursos que exigem essas permissões podem estar acessíveis, mas com limitações. Por exemplo, uma FileIOPermission restrita pode especificar que o aplicativo pode ter acesso ao sistema de arquivos, mas somente aos diretórios abaixo da raiz do diretório virtual do aplicativo.

Por que a confiança parcial?

Configurando um aplicativo ou um Web Service como parcialmente confiável, você pode restringir capacidade do aplicativo de acessar recursos essenciais do sistema ou recursos pertencentes a outros aplicativos da Web. Concedendo apenas as permissões de que o aplicativo precisa e nada mais, você pode criar aplicativos da Web menos privilegiados e limitar o potencial de danos caso o aplicativo da Web seja comprometido por um ataque de injeção de código.

Problemas que podem ser encontrados

Se você tomar um aplicativo da Web existente e reconfigurá–lo para funcionar com um nível de confiança parcial, poderá encontrar os seguintes problemas a menos que o aplicativo seja extremamente limitado nos recursos a que pode ter acesso:

O seu aplicativo não é capaz de chamar conjuntos com nomes de alta segurança que não são comentados com AllowPartiallyTrustedCallersAttribute (APTCA) . Sem o APTCA, os conjuntos com nomes de alta segurança emitem uma solicitação de confiança total, que falhará quando a solicitação chegar ao seu aplicativo da Web parcialmente confiável. Muitos conjuntos do sistema permitem apenas chamadores de confiança total. A lista a seguir mostra quais conjuntos do .NET Framework permitem chamadores parcialmente confiáveis e quais podem ser chamados diretamente por aplicativos da Web parcialmente confiáveis sem precisar de conjuntos wrapper no modo seguro.

Observação: o uso do modo seguro será discutido detalhadamente mais adiante neste módulo.

Os seguintes conjuntos de sistema têm o APTCA aplicado. Isso significa que podem ser chamados por aplicativos parcialmente confiáveis da Web ou por qualquer código parcialmente confiável:

System.Windows.Forms.dll

System.Drawing.dll

System.dll

Mscorlib.dll

IEExecRemote.dll

Accessibility.dll

Microsoft.VisualBasic.dll

System.XML.dll

System.Web.dll

System.Web.Services.dll

System.Data.dll

O seu aplicativo parcialmente confiável falha porque chama um conjunto com nome de alta segurança que não está marcado com APTCA, e uma SecurityException é gerada. Neste caso, a exceção não contém nenhuma informação adicional para indicar que a chamada falhou devido a uma solicitação mal–sucedida de confiança total.

As solicitações de permissão podem começar a falhar. O nível de confiança configurado pode não conhecer a permissão necessária para que o seu aplicativo acesse um tipo específico de recurso. A seguir são apresentadas algumas situações comuns nas quais isso pode acabar sendo problemático:

O seu aplicativo utiliza o Log de eventos ou o Registro. Aplicativos da Web parcialmente confiáveis não têm as permissões necessárias para acessar esses recursos do sistema. Se o seu código o fizer, será gerada uma SecurityException.

O seu aplicativo utiliza o provedor de dados OLE DB ADO.NET para acessar uma fonte de dados. O provedor de dados OLE DB exige chamadores de confiança total.

O seu aplicativo chama um Web Service. Aplicativos da Web parcialmente confiáveis têm uma WebPermission restrita, e isso afeta a capacidade do aplicativo de chamar Web Services que se encontram em locais remotos.

Início da páginaInício da página

Níveis de confiança

Se você planeja transferir um aplicativo existente para um nível de confiança parcial, uma boa solução é reduzir as permissões de forma incremental para que você possa ver quais partes do seu aplicativo falham. Por exemplo, comece definindo o atributo de confiança level como Alto, em seguida como Médio, e assim por diante. Finalmente, o nível de confiança a que você deve visar depende do nível de restrição que você deseja estabelecer para o aplicativo. Use as seguintes orientações:

Aplicativos configurados com confiança alta, média, baixa ou mínima não poderão chamar códigos não gerenciados ou componentes de serviço, gravar no log de eventos, acessar filas do Enfileiramento de mensagens, ou acessar fontes de dados do banco de dados OLE.

Aplicativos configurados com confiança alta têm acesso irrestrito ao sistema de arquivos.

Aplicativos configurados com confiança média têm acesso restrito ao sistema de arquivos. Eles podem acessar apenas os arquivos da sua própria hierarquia de diretório de aplicativos.

Aplicativos configurados com confiança baixa ou mínima não podem acessar bancos de dados SQL Server.

Aplicativos de confiança mínima não têm acesso a nenhum recurso.

A Tabela 9.3 identifica as permissões concedidas por cada um dos níveis de confiança ASP.NET O nível full (total) foi omitido da tabela, pois ele garante todas as permissões em seus estados irrestritos

Tabela 9.3 Permissões de diretiva e níveis de confiança padrão do ASP.NET

Permissão e estadoHighMediumLowMinimal

AspNetHosting
Level

Alta

Média

Baixa

Mínima

DnsPermission
Unrestricted

 

 

EnvironmentPermission
Unrestricted
Read Write

TEMP; TMP;
USERNAME;
OS;
COMPUTER
NAME

 

 

EventLogPermission

 

 

 

 

FileIOPermission
Unrestricted
Read
Write
Append
PathDiscovery



$AppDir$
$AppDir$
$AppDir$
$AppDir$



$AppDir$


$AppDir$

 

IsolatedStorageFilePermission
Unrestricted
AssemblyIsolationByUser
Unrestricted UserQuota





1MB
(pode variar de acordo com o local)

 

OleDbClientPermission
Unrestricted

 

 

 

 

PrintingPermission
Unrestricted
DefaultPrinting

 

 

ReflectionPermission
Unrestricted
ReflectionEmit

 

 

 

RegistryPermission
Unrestricted

 

 

 

SecurityPermission
Unrestricted
Assertion
Execution
ControlThread ControlPrinicipal
RemotingConfiguration













SocketPermission
Unrestricted


 

 

 

SqlClientPermission
Unrestricted



 

 

WebPermission
Unrestricted


$OriginHost$

 

 

Início da páginaInício da página

Abordagens de aplicativos da Web parcialmente confiáveis

Se você desenvolver um aplicativo parcialmente confiável ou permitir que um aplicativo existente seja executado em um nível de confiança parcial e encontrar problemas pelo fato de o seu aplicativo tentar acessar recursos para os quais não tenham sido concedidas as respectivas permissões, você pode adotar duas abordagens básicas:

Personalizar a diretiva
Personalize a diretiva para conceder as permissões necessárias ao seu aplicativo. Isso pode não ser possível, por exemplo, em ambientes de hospedagem, nos quais as restrições de diretivas são rígidas.

Colocar o código privilegiado no modo seguro
Coloque o código de acesso ao recurso em um conjunto wrapper, conceda full trust (confiança total) ao conjunto wrapper (não ao aplicativo da Web), coloque no modo seguro os requisitos de permissão do código privilegiado.

A abordagem certa depende do problema. Se o problema estiver relacionado ao fato de você estar tentando chamar um conjunto de sistema que não contém o AllowPartiallyTrustedCallersAttribute o problema passa a ser como conceder confiança total a um código. Nesta situação, você deve usar a abordagem da colocação no modo seguro e conceder confiança total ao conjunto wrapper colocado no modo seguro.

Observação: a personalização de diretivas é a mais fácil das duas abordagens porque não exige nenhum esforço de desenvolvimento.

Início da páginaInício da página

Personalizar a diretiva

Se o seu aplicativo da Web contém código que exige permissões além das concedidas por um determinado nível de confiança do ASP.NET, a opção mais fácil é personalizar um arquivo de diretivas para conceder a permissão adicional de segurança de acesso ao código ao seu aplicativo da Web. Você pode modificar um arquivo de diretivas existente e conceder mais permissões ou criar um novo arquivo com base em um arquivo de diretivas existente.

Observação: se você modificar um dos arquivos de diretivas internos, por exemplo, o arquivo de diretivas Web_mediumtrust.config de confiança média, isso afetará todos os aplicativos configurados para funcionar com um nível médio de confiança.

Para personalizar a diretiva de um aplicativo específico

1.

Copie um dos arquivos de diretivas existentes para criar um novo arquivo de diretivas. Por exemplo, copie o arquivo de diretivas de confiança média e crie um novo arquivo de diretivas como o seguinte:

%windir%\Microsoft.NET\Framework\{versão}\CONFIG\web_yourtrust.config 

2.

Inclua a permissão necessária no conjunto de permissões ASP.NET do arquivo de diretivas ou, como alternativa, modifique uma permissão existente para conceder uma permissão menos restritiva.

3.

Inclua um novo mapeamento de <trustLevel> abaixo de <securityPolicy> em Machine.config para o novo arquivo de nível de confiança, da seguinte forma:

<securityPolicy> 
  <trustLevel name="Custom" policyFile="web_yourtrust.config"/> 
  . . . 
</securityPolicy> 

4.

Configure o seu aplicativo para funcionar com o novo nível de confiança configurando o elemento <trust> no arquivo Web.config do aplicativo, como segue:

<system.web> 
  <trust level="Custom" originUrl=""/> 
</system.web>
Início da páginaInício da página

Código privilegiado no modo de segurança

Outra abordagem que não exige a atualização para a diretiva de segurança de acesso ao código do ASP.NET é empacotar o seu código de acesso ao recurso no seu próprio conjunto wrapper e configurar a diretiva de segurança de acesso ao código do computador para conceder ao conjunto específico a permissão adequada. Então, você pode colocar no modo seguro o código mais privilegiado, usando o método CodeAccessPermission.Assert para que você não precise mudar a concessão geral de permissão do aplicativo da Web. O método Assert impede que a solicitação de segurança emitida pelo código de acesso ao recurso se propague na pilha de chamadas além dos limites do conjunto wrapper.

Um padrão de colocação no modo seguro

Você pode aplicar o seguinte padrão a qualquer código privilegiado que precise acessar um recurso restrito ou realizar outra operação privilegiada para a qual o aplicativo da Web pai não tenha permissões suficientes:

1.

Encapsule o código de acesso ao recurso em um conjunto wrapper.
Verifique se o conjunto possui um nome de alta segurança para que ele possa ser instalado no GAC.

2.

Declare a respectiva permissão antes de acessar o recurso.
Isso significa que o chamador deverá ter a permissão de segurança de declaração (SecurityPermission com SecurityPermissionFlag.Assertion). Aplicativos configurados para os níveis de confiança a partir do Médio têm essa permissão.

Declarar permissões é perigoso porque significa que o código que chama o seu código pode ter acesso ao recurso encapsulado pelo seu conjunto sem precisar da respectiva permissão de acesso ao recurso. A instrução Assert diz que o seu código pode garantir a legitimidade dos chamadores. Para isso, o seu código deve solicitar uma permissão alternativa para que possa autorizar o código chamador antes de chamar a instrução Assert. Dessa forma, você permite que apenas o código possuidor da permissão alternativa tenha acesso ao recurso exposto pelo seu conjunto.

O .NET Framework pode não possuir uma permissão adequada para solicitação. Nesse caso, você pode criar e solicitar uma permissão personalizada. Para obter mais informações sobre como criar uma permissão personalizada, consulte "Como: criar uma permissão de criptografia personalizada" na seção "Como" desse guia.

3.

Comente o conjunto wrapper com o APTCA.
Isso permite que o aplicativo parcialmente confiável da Web chame o conjunto.

4.

Instale o conjunto wrapper no GAC.
Isso concede confiança total ao wrapper, mas não ao aplicativo da Web. Os arquivos de diretivas do ASP.NET contêm o seguinte grupo de códigos, que concede confiança total a qualquer conjunto localizado no GAC:

<CodeGroup 
   class="UnionCodeGroup" 
   version="1" 
   PermissionSetName="FullTrust> 
   <IMembershipCondition 
       class="UrlMembershipCondition" 
       Url="$Gac$/*" 
       version="1" 
   /> 
</CodeGroup> 

Observação: a diretiva de empresa e de máquina local padrão também concede confiança total a qualquer código localizado na zona Meu computador, o que inclui o código instalado no GAC. Isso é importante porque as permissões concedidas fazem intersecção com todos os níveis de diretivas.

5.

Configure o nível de confiança do aplicativo da Web (por exemplo, em "Médio").

A Figura 9.2 mostra a abordagem de colocação no modo seguro.

Colocação de um código privilegiado no modo seguro no seu próprio conjunto, o que declara a respectiva permissão

Figura 9.2
Colocação de um código privilegiado no modo seguro no seu próprio conjunto, o que declara a respectiva permissão

É uma prática recomendável usar conjuntos separados para encapsular o acesso aos recursos, além de evitar a colocação do código de acesso ao recurso em arquivos .aspx ou códigos por trás de arquivos. Por exemplo, crie um conjunto separado de acesso a dados para encapsular o acesso a bancos de dados. Isso facilita a transferência de aplicativos para ambientes parcialmente confiáveis.

Início da páginaInício da página

Decidindo a abordagem que será adotada

A abordagem certa depende do problema que você está tentando resolver, dependendo também do fato de você ter ou não a opção de modificar a diretiva de segurança no servidor de Web.

Personalizando diretivas

Esta abordagem é a mais fácil das duas e não exige nenhum esforço de desenvolvimento. Entretanto, você pode não ter a permissão para modificar diretivas no servidor de Web e, em determinadas situações, o seu código que chama a biblioteca de classes do .NET Framework pode exigir confiança total. nesses casos, você deve usar o modo seguro. Nessas situações deve ser usado o modo seguro. Por exemplo, os recursos a seguir exigem confiança total, e você deve colocar o seu código de acesso ao recurso no modo seguro ao acessá–los:

Log de eventos (por meio da classe EventLog)

Fontes de dados OLE DB (por meio do provedor de dados OLE DB ADO.NET)

Fontes de dados ODBC (por meio do provedor de dados .NET ODBC ADO.NET)

Bancos de dados Oracle (por meio do provedor de dados .NET Oracle ADO.NET)

Observação: esta lista não pretende esgotar as possibilidades, mas apresenta os tipos de recursos usados mais freqüentemente e que em condições normais exigem confiança total.

Modo seguro

Se você colocar no modo seguro o código do seu aplicativo privilegiado em um conjunto separado, poderá conceder mais permissões ao conjunto. Como alternativa, você pode conceder a ele confiança total sem exigir que todo o seu aplicativo funcione com permissões estendidas.

Por exemplo,considere o código que usa o provedor de dados ADO.NET OLE DB e interage com a classe System.Data.OleDb.OleDbCommand Esse código requer confiança total. Embora o conjunto System.Data.dll esteja marcado com AllowPartiallyTrustedCallersAttribute, a classe System.Data.OleDb.OleDbCommand entre outras, não pode ser chamada por chamadores parcialmente confiáveis porque está protegida por uma solicitação associada de confiança total. Para ver isso, execute o comando a seguir por meio do utilitário permview no diretório %windir%\Microsoft.NET\Framework\{versão}:

permview /DECL /OUTPUT System.Data.Perms.txt System.Data.dll 

A saída no System.Data.Perms.txt conterá o seguinte:

Conjunto de permissões class System.Data.OleDb.OleDbCommand LinktimeDemand: 
<PermissionSet class="System.Security.PermissionSet" 
               version="1" Unrestricted="true"/> 

Isso ilustra um conjunto de permissão irrestrita (confiança total) que é usado em uma demanda de link protetor da classe System.Data.OleDb.OleDbCommand. Em cenários como esses, configurar a diretiva não é suficiente para garantir permissões irrestritas específicas, tais como OleDbPermission a seu código parcialmente confiável. Em vez disso, você deve colocar o seu código de acesso ao recurso no modo seguro e conceder ele confiança total, e a forma mais fácil de fazer isso é instalá–lo no GAC. Use o Permview.exe para descobrir sobre as permissões necessárias de outras classes, embora esse procedimento exiba apenas atributos de segurança declarativos. Se uma classe exigir obrigatoriamente confiança total, você não poderá vê–la por meio do Permview.exe. Nesse caso, teste os requisitos de segurança da classe, chamando–a pelo código parcialmente confiável e diagnosticando todas as exceções de segurança.

Observação: só porque um conjunto está marcado com APTCA, isso não significa que todas as classes contidas admitem chamadores parcialmente confiáveis. Algumas classes podem conter solicitações explícitas de confiança total.

Início da páginaInício da página

Confiança Média

Se você hospeda aplicativos da Web, pode optar por implementar uma diretiva de segurança de confiança média para restringir operações privilegiadas. Esta seção concentra–se na execução de aplicativos de confiança média, e mostra como superar os problemas que provavelmente aparecerão.

As duas principais vantagens de executar um aplicativo no modo de confiança média são as seguintes:

Menor área exposta a ataques

Isolamento do aplicativo

Menor área exposta a ataques

Uma vez que confiança média não concede ao aplicativo acesso irrestrito a todas as permissões, a sua área exposta a ataques é reduzida por meio da concessão de um subconjunto do conjunto completo de permissões ao aplicativo. Muitas das permissões concedidas pela diretiva de confiança média também estão em um estado restrito. Se um atacante conseguir, de alguma forma, assumir o controle do seu aplicativo, seu espaço de atuação será limitado.

Isolamento do aplicativo

O isolamento do aplicativo por meio da segurança de acesso ao código restringe o acesso a recursos do sistema e a recursos de propriedade de outros aplicativos. Por exemplo, embora a identidade do processo tenha permissão de ler e gravar arquivos fora do diretório do aplicativo da Web, a FileIOPermission nos aplicativos de confiança média é restrita. Ela permite apenas que o aplicativo leia ou grave na sua própria hierarquia de diretório.

Início da páginaInício da página

Restrições do modo de confiança média

Se o seu aplicativo for executado em confiança média, ele enfrentará uma série de restrições, sendo as mais significativas:

Ele não poderá acessar diretamente o log de eventos.

Ele terá acesso restrito ao sistema de arquivos e poderá acessar apenas os arquivos contidos na hierarquia de diretório virtual do aplicativo.

Ele não poderá acessar diretamente fontes de dados do banco de dados OLE (embora os aplicativos de confiança média tenham a SqlClientPermission que permite a eles acessarem o SQL Server).

Ele possuirá acesso limitado a Web Services.

Ele não poderá acessar diretamente o registro do Windows.

Esta seção mostra como acessar os seguintes tipos de recursos a partir de um aplicativo da Web ou Web Service de confiança média:

OLE DB

Log de eventos

Web Services

Registro

OLE DB

Os aplicativos da Web de confiança média não recebem a OleDbPermission. Além disso, o provedor de dados .NET OLE DB exige, atualmente, chamadores de confiança total. Se você tiver um aplicativo que precise acessar fontes de dados OLE DB no modo de confiança média, use a abordagem da colocação no modo seguro. Coloque o seu código de acesso a dados em um conjunto separado, atribua a ele um nome de alta segurança e instale–o no GAC, o que concederá a ele confiança total.

Observação: a modificação da diretiva não funcionará a menos que você defina o nível de confiança como "Full", pois o provedor gerenciado OLE DB exige confiança total.

A Figura 9.3 mostra a disposição.

Acesso ao recurso OLE DB no modo seguro

Figura 9.3
Acesso ao recurso OLE DB no modo seguro

Modo seguro

Nesta abordagem, você cria um conjunto wrapper para encapsular o acesso à fonte de dados do banco de dados OLE. Esse conjunto recebe permissões de confiança total, necessárias para usar o provedor gerenciado OLE DB ADO.NET.

Para criar um conjunto wrapper no modo seguro para chamar fontes de dados do banco de dados OLE

1.

Crie um conjunto para o seu código de acesso a dados. Configure a versão do conjunto, atribua ao conjunto um nome de alta segurança e marque–o com o AllowPartiallyTrustedCallersAttribute da seguinte forma:

[assembly: AssemblyVersion("1.0.0.0")] 
[assembly: AssemblyKeyFile(@"..\..\oledbwrapper.snk")] 
[assembly:AllowPartiallyTrustedCallersAttribute()] 

Você deve comentar qualquer conjunto que tenha um nome de alta segurança com AllowPartiallyTrustedCallersAttribute se quiser permitir chamadores parcialmente confiáveis. Isso elimina uma solicitação associada implícita de confiança total feita pelo .NET Framework sempre que o código de um conjunto com nome de alta segurança for carregado e imediatamente compilado.

2.

Solicite confiança total. Embora não seja estritamente necessária, a solicitação de confiança total é recomendada porque permite a um administrador ver os requisitos de permissão de um conjunto por meio de ferramentas como o Permview.exe. Para solicitar confiança total, solicite o conjunto irrestrito de permissões da seguinte forma:

[assembly: PermissionSet(SecurityAction.RequestMinimum, Unrestricted=true)] 

3.

Empacote as chamadas ao banco de dados com uma instrução Assert para declarar confiança total. Empacote uma chamada RevertAssert correspondente para anular o efeito da declaração. Embora não seja estritamente necessária, a colocação da chamada ao RevertAssert em um bloco 'finally' é recomendada.
Pelo fato de o provedor do OLE DB exigir confiança total, o wrapper deve declarar confiança total. Não basta declarar uma OleDbPermission. O Passo 7 explica como aumentar a segurança do uso de CodeAccessPermission.Assert.

public OleDbDataReader GetProductList() 
{ 
  try 
  { 
    // Assert full trust (the unrestricted permission set) 
    new PermissionSet(PermissionState.Unrestricted).Assert(); 
    OleDbConnection conn = new OleDbConnection( 
       "Provider=SQLOLEDB; Data Source=(local);" + 
       "Integrated Security=SSPI; Initial Catalog=Northwind"); 
    OleDbCommand cmd = new OleDbCommand("spRetrieveProducts", conn); 
    cmd.CommandType = CommandType.StoredProcedure; 
    conn.Open(); 
    OleDbDataReader reader = 
          cmd.ExecuteReader(CommandBehavior.CloseConnection); 
    return reader; 
  } 
  catch(OleDbException dbex) 
  { 
    // Log and handle exception 
  } 
  catch(Exception ex) 
  { 
    //  Log and handle exception 
  } 
  finally 
  { 
    CodeAccessPermission.RevertAssert(); 
  } 
  return null; 
}

4.

Construa o conjunto e instale–o no GAC com o seguinte comando:

gacutil -i oledbwrapper.dll 

Para garantir que o conjunto seja incluído no GAC após cada reconstrução subseqüente, inclua a seguinte linha de comando de evento pós–construção (disponível nas propriedades do projeto no Visual Studio.NET) ao seu projeto do conjunto wrapper:

"C:\Arquivos de programas\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin\gacutil.exe" 
/i $(TargetPath) 

Observação: qualquer conjunto com nome de alta segurança que seja chamado por um aplicativo da Web ou Web Service ASP.NET deve ser instalado no GAC. Neste caso, você deve instalar o conjunto no GAC para garantir que ele receba confiança total.

5.

Configure o seu aplicativo da Web para confiança média. Inclua o código a seguir ao Web.config o coloque–o em Machine.config dentro de um elemento <location> que aponte para o seu aplicativo:

<trust level="Medium" originUrl=""/> 

6.

Faça referência ao conjunto de acesso a dados a partir do seu aplicativo da Web ASP.NET.
Uma vez que um conjunto com nome de alta segurança deve estar no GAC e não no diretório \bin de um aplicativo da Web, você deve incluir o conjunto na lista de conjuntos usados no aplicativo se não estiver usando código por trás dos arquivos. Você pode obter o PublicKeyToken do seu conjunto por meio do seguinte comando:

sn -Tp oledbwrapper.dll 

Observação: use um parâmetro –T maiúsculo.

Em seguida, inclua o seguinte no Machine.config ou no Web.config:

<compilation debug="false" > 
  <assemblies> 
    <add assembly="oledbwrapper, Version=1.0.0.0, Culture=neutral, 
         PublicKeyToken=4b...06"/> 
  </assemblies> 
</compilation> 

Observação: em recriações sucessivas de seu conjunto wrapper, talvez você precise reciclar o processo do operador ASP.NET, pois seu conjunto wrapper instalado no GAC é armazenado em cache pelo processo ASP.NET. A fim de reciclar o processo do operador ASP.NET (Aspnet_wp.exe) execute o utilitário IISreset.exe.

7.

Proteja o código que chama o Assert.
A chamada ao Assert significa que qualquer código que chame o wrapper de acesso a dados poderá interagir com a fonte de dados do banco de dados OLE. Para evitar que códigos mal–intencionados chamem o componente de acesso a dados e possam utilizá–lo para atacar o banco de dados, você pode emitir uma solicitação total de permissão personalizada antes de chamar o Assert e atualizar o arquivo de diretivas de confiança média para conceder ao seu aplicativo da Web a permissão personalizada. Essa solução implica um considerável esforço do desenvolvedor.

Para obter mais informações sobre o desenvolvimento de uma permissão personalizada, consulte "Como: criar uma permissão de criptografia personalizada" na seção "Como" desse guia.

Log de eventos

A classe EventLogPermission é projetada para encapsular os direitos do código de acessar o log de eventos. Atualmente, entretanto, o código deve receber confiança total para poder acessar o log de eventos. Isso significa que um aplicativo da Web de confiança média não poderá acessar diretamente o log de eventos. Para isso, você deve colocar no modo seguro o seu código de registro de eventos.

Acessando o log de eventos

Primeiramente, verifique se a conta do processo usada para executar o seu aplicativo da Web (ou a identidade do segmento, se o seu aplicativo for representante) é capaz de criar fontes de eventos. Para isso, o processo ou a identidade do segmento deve ser capaz de criar chaves de registro abaixo da seguinte chave:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog 

No mínimo, a identidade do processo ASP.NET de qualquer identidade representada deve ter as seguintes permissões nesta chave de registro:

Consultar o valor da chave

Definir o valor da chave

Criar uma subchave

Enumerar subchaves

Notificar

Ler

Esses parâmetros devem ser aplicados à chave acima e às subchaves. Como alternativa, você pode criar fontes de eventos no momento da instalação quando estiverem disponíveis direitos administrativos. Para obter mais informações sobre esta abordagem, consulte "Auditoria e registro", "Criando Páginas e Controles ASP.NET Seguros".

Modo seguro

Para colocar no modo seguro o seu código de registro de eventos, crie um conjunto wrapper para encapsular o acesso ao log de eventos. Em seguida, instale o conjunto wrapper no GAC (Cache de Conjunto Global) para que a diretiva segurança de acesso ao código conceda a ele confiança total.

Para criar um conjunto wrapper no modo seguro para gravar no log de eventos

1.

Crie um conjunto para o seu código de log de eventos. Configure a versão do conjunto, atribua ao conjunto um nome de alta segurança e marque–o com o AllowPartiallyTrustedCallersAttribute como mostra o exemplo abaixo.

[assembly: AssemblyVersion("1.0.0.0")] 
[assembly: AssemblyKeyFile(@"..\..\eventlogwrapper.snk")] 
[assembly:AllowPartiallyTrustedCallersAttribute()] 

Você deve comentar qualquer conjunto que tenha um nome de alta segurança com AllowPartiallyTrustedCallersAttribute se quiser permitir chamadores parcialmente confiáveis. Isso elimina uma solicitação associada implícita de confiança total feita pelo .NET Framework sempre que o código de um conjunto com nome de alta segurança for carregado e imediatamente compilado.

Observe que AllowPartiallyTrustedCallersAttribute é definido no espaço para nome do System.Security de modo que você deve fazer referência a esse espaço com uma instrução using

2.

Solicite as permissões adequadas.
Embora não seja estritamente necessário, recomenda–se solicitar as permissões apropriadas porque isso permite ao administrador ver os requisitos de permissão do conjunto por meio de ferramentas como o Permview.exe. Uma vez que o conjunto do log de eventos pode ser acessado por chamadores parcialmente confiáveis, esse conjunto não precisa solicitar um conjunto de permissões de confiança total. O conjunto neste exemplo apenas grava no log de eventos em uma máquina específica e, portanto, precisa apenas da seguinte solicitação de permissão:

[assembly:EventLogPermissionAttribute(SecurityAction.RequestMinimum, 
MachineName="<machine name>", 
PermissionAccess=EventLogPermissionAccess.Instrument)] 

Entretanto, se o seu conjunto precisar solicitar confiança total, solicite o conjunto de permissões irrestritas da seguinte forma:

[assembly: PermissionSet(SecurityAction.RequestMinimum, Unrestricted=true)] 

3.

Empacote as chamadas ao log de eventos com uma instrução Assert que declara a confiança total, e uma instrução RevertAssert correspondente que anule o efeito da declaração. Embora não seja estritamente necessária, a colocação da chamada ao RevertAssert em um bloco 'finally' é recomendada. O código a seguir grava uma entrada Information no log do Aplicativo com o texto "Writing to the event log":

try 
{ 
  string source = "Event Source"; 
  string log = "Application"; 
  string eventText = "Writing to the event log"; 
  EventLogEntryType eventType = EventLogEntryType.Information; 
  //Assert permission 
  EventLogPermission eventPerm; 
  eventPerm = new EventLogPermission (EventLogPermissionAccess.Instrument, 
"<machinename>"); 
  eventPerm.Assert(); 
  //Check to see if the source exists. 
  if(!EventLog.SourceExists(source)) 
  {//The keys do not exist, so register your application as a source 
     EventLog.CreateEventSource(source, log); 
  } 
  //Write to the log. 
  EventLog.WriteEntry(source, eventText, eventType); 
  } 
  catch(Exception ex) 
  {/*Handle exception*/} 
  finally 
  { 
    CodeAccessPermission.RevertAssert(); 
  } 

4.

Construa o conjunto e instale–o no GAC com o seguinte comando:

gacutil -i eventlogwrapper.dll 

Para garantir que o conjunto seja incluído no GAC após cada reconstrução subseqüente, inclua a seguinte linha de comando de evento pós–construção (disponível nas propriedades do projeto no Visual Studio.NET) ao seu projeto do conjunto wrapper:

"C:\Arquivos de programas\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin\gacutil.exe" 
/i $(TargetPath) 

Observação: qualquer conjunto com nome de alta segurança chamado por um aplicativo da Web ou Web Service ASP.NET deve ser instalado no GAC. Conjuntos instalados no GAC recebem confiança total da diretiva–padrão de segurança de acesso ao código.

5.

Configure o seu aplicativo da Web para confiança média. Inclua o parâmetro abaixo no Web.config ou coloque–o no Machine.config dentro de um elemento <location> que aponte para o seu aplicativo:

<trust level="Medium" originUrl=""/> 

6.

Faça referência ao conjunto de log de eventos a partir do seu aplicativo da Web ASP.NET.

Uma vez que um conjunto com nome de alta segurança deve estar no GAC e não no diretório \bin de um aplicativo da Web, você deve incluir o conjunto na lista de conjuntos usados no aplicativo se não estiver usando código por trás dos arquivos. Você pode obter o PublicKeyToken do seu conjunto por meio do seguinte comando:

sn -Tp eventlogwapper.dll 

Observação: use um parâmetro –T maiúsculo.

Em seguida, inclua o seguinte código em Machine.config ou Web.config:

<compilation debug="false" > 
  <assemblies> 
    <add assembly="eventlogwrapper, Version=1.0.0.0, Culture=neutral, 
         PublicKeyToken=4b...06"/> 
  </assemblies> 
</compilation> 

Observação: em recriações sucessivas de seu conjunto wrapper, talvez você precise reciclar o processo do operador ASP.NET, pois seu conjunto wrapper instalado no GAC é armazenado em cache pelo processo ASP.NET. A fim de reciclar o processo do operador ASP.NET (Aspnet_wp.exe) execute o utilitário IISreset.exe.

7.

Proteja o código que chama o método Assert. A chamada ao Assert significa que qualquer código que chame o wrapper do log de eventos poderá interagir com o log de eventos. Para evitar que códigos mal–intencionados chamem o wrapper de log de eventos e o utilizem para preencher o log de eventos, você pode emitir uma solicitação total de permissão personalizada antes de chamar o Assert e atualizar o arquivo de diretivas de confiança média para conceder ao seu aplicativo da Web a permissão personalizada. Essa solução implica um considerável esforço do desenvolvedor.

Para obter mais informações sobre o desenvolvimento de uma permissão personalizada, consulte "Como: criar uma permissão de criptografia personalizada" na seção "Como" desse guia.

Web Services

Por padrão, a diretiva de confiança média concede aos aplicativos da Web ASP.NET uma WebPermission restrita. Para poder chamar Web Services a partir do seu aplicativo da Web, você deve configurar o atributo originUrl no elemento <trust> do seu aplicativo.

Para chamar um único Web Service a partir de um aplicativo da Web de confiança média

1.

Configure o aplicativo para ser executado em confiança média.

2.

Configure originUrl para apontar para o Web Service que você deseja chamar, da seguinte maneira:

<trust level="Medium" originUrl="http://servername/.*"/> 

O valor de originUrl é usado no construtor para uma classe de expressão regular System.Text.RegEx de forma que ele possa realizar uma correspondência com as URLs que podem ser acessadas pelo Web Service. Esta classe RegEx é usada junto com a classe WebPermission. O ".*" corresponde a qualquer URL que comece por "http://servername/".

O atributo originUrl é usado quando a diretiva ASP.NET é avaliada. Ela atribui um valor ao parâmetro de substituição $OriginHost$. Aqui está a definição de WebPermission a partir do Web_mediumtrust.config:

<IPermission 
   class="WebPermission" 
   version="1"> 
   <ConnectAccess> 
     <URI uri="$OriginHost$"/> 
   </ConnectAccess> 
</Ipermission> 

Se você não especificar os servidores de Web acessados pelo seu aplicativo, qualquer solicitação de Web Services falhará com uma SecurityException. Para chamar um Web Service no servidor de Web local, use a seguinte configuração:

<trust level="Medium" originUrl="http://localhost/.*" /> 

Se o seu aplicativo precisar acessar vários Web Services em diferentes servidores, você precisará personalizar a diretiva ASP.NET porque é possível especificar apenas um originUrl no elemento <trust> de Web.config ou Machine.config.

Para chamar vários Web Services a partir de um aplicativo de confiança média

1.

Copie o arquivo Web_mediumtrust.config, que se encontra no seguinte diretório, em um arquivo chamado Web_mediumtrust_WebService.config, localizado no mesmo diretório.

%windir%\Microsoft.NET\Framework\{versão}\CONFIG 

2.

Localize o WebPermission e inclua um elemento <URI> em cada servidor que precisar acessar, da seguinte forma:

<IPermission class="WebPermission" version="1"> 
  <ConnectAccess> 
    <URI uri="$OriginHost$"/> 
    <URI uri="http://server1/.*"/> 
    <URI uri="http://server2/.*"/> 
    <URI uri="http://server3/.*"/> 
  </ConnectAccess> 
</Ipermission> 

Se você chamar o Web Service usando o seu nome NetBIOS, o nome DNS, e/ou o endereço IP, precisará de um elemento <URI> separado para cada URI, como mostra o exemplo a seguir.

<IPermission class="WebPermission" version="1"> 
  <ConnectAccess> 
    <URI uri="$OriginHost$"/> 
    <URI uri="http://servername.yourDomain.com/.*"/> 
    <URI uri="http:// servername/.*"/> 
    <URI uri="http://127.0.0.1/.*"/> 
  </ConnectAccess> 
</Ipermission> 

3.

Salve o arquivo.

4.

Atualize o arquivo Web.config do seu aplicativo para apontar para o arquivo de diretivas recém– criado. Isso exige que você crie um novo nível de confiança e faça seu mapeamento para o novo arquivo de diretivas. Em seguida, configure o elemento <trust> do seu aplicativo para usar o novo nível.

O fragmento a seguir mostra as inclusões necessárias no Web.config:

<system.web> 
  <securityPolicy> 
    <trustLevel name="MediumPlusWebPermission" 
                policyFile="web_mediumtrust_WebService.config"/> 
  </securityPolicy> 
  <trust level=" MediumPlusWebPermission" originUrl=""/> 
</system.web>

Utilizando credenciais padrão

Talvez você precise chamar um Web Service que utiliza a autenticação do Windows e especifique credenciais de autenticação por meio da cache de credenciais de proxy. Por exemplo:

proxy.Credentials = System.Net.CredentialCache.DefaultCredentials; 

Neste caso, o aplicativo ASP.NET exige o EnvironmentPermission com acesso de leitura à variável de ambiente USERNAME. A diretiva–padrão de confiança média concede essa permissão aos aplicativos da Web.

Em uma situação de ASP.NET no lado do servidor, as credenciais são obtidas no segmento do aplicativo ASP.NET ou no identificador do processo. Se DefaultCredentials for usado a partir de um aplicativo de desktop, será usado o identificador interativo atual do usuário. A solicitação da EnvironmentPermission é uma estratégia de redução de riscos criada para garantir que o código não possa usar as credenciais do usuário local à vontade e expô–las à rede.

Registro

Por padrão, aplicativos da Web de confiança média não recebem a RegistryPermission. Para configurar o seu aplicativo para acessar o registro, você deve modificar a diretiva ASP.NET para conceder essa permissão ao seu aplicativo ou desenvolver um conjunto wrapper no modo seguro que tenha a permissão necessária.

A abordagem de colocação no modo seguro é a mesma descrita anteriormente para as fontes de dados do banco de dados OLE e para o log de eventos.

Personalizando diretivas

A maneira mais fácil de personalizar uma diretiva é criar um arquivo de diretiva personalizada com base no arquivo de diretivas de confiança média e configurar o seu aplicativo para o uso da diretiva personalizada. A diretiva personalizada concede a RegistryPermission ao aplicativo.

Para criar uma diretiva personalizada a fim de liberar o acesso ao registro

1.

Copie o arquivo Web_mediumtrust.config, que se encontra no seguinte diretório, em um arquivo chamado Web_mediumtrust_Registry.config, localizado no mesmo diretório.

%windir%\Microsoft.NET\Framework\{versão}\CONFIG 

Com a criação de uma cópia e de um arquivo de diretiva personalizado, você evita que sejam feitas alterações no arquivo Web_mediumtrust.config. Ao alterar diretamente o arquivo padrão de confiança média, todos os aplicativos são alterados na máquina que se encontra configurada para confiança média.

2.

Localize o elemento <SecurityClasses> e inclua o seguinte para registrar a classe RegistryPermission:

<SecurityClass Name="RegistryPermission" 
               Description="System.Security.Permissions.RegistryPermission, 
               mscorlib, Version=1.0.5000.0, Culture=neutral, 
               PublicKeyToken=b77a5c561934e089"/> 

3.

Localize o conjunto de permissões ASP.NET e inclua a RegistryPermission irrestrita no conjunto de permissões, da seguinte forma:

<IPermission class="RegistryPermission" version="1" Unrestricted="true" /> 

4.

Salve o arquivo.

5.

Atualize Machine.config par criar um novo nível de confiança que será mapeado para o novo arquivo de diretivas.

<system.web> 
  <securityPolicy> 
    <trustLevel name="MediumPlusRegistry" 
                policyFile="web_mediumtrust_Registry.config "/> 
  </securityPolicy> 

6.

Atualize o Web.config do seu aplicativo para configurar o nível <trust> do aplicativo.

<system.web> 
  <trust level="MediumPlusRegistry" originUrl=""/> 
</system.web>
Início da páginaInício da página

Resumo

A segurança de acesso ao código é um modelo de segurança de restrição a recursos que pode ser usado para ajudar a isolar aplicativos. Os aplicativos podem ser configurados para funcionar em vários níveis de confiança parciais. O nível de confiança determina as permissões que são concedidas ao aplicativo ASP.NET Web ou ao Web Service. Isso determina os tipos de fontes que podem ser acessadas e outros tipos de operações privilegiadas que podem ser executadas. Observe que todo acesso a recursos está, em última análise, sujeito à segurança do sistema operacional.

O modelo recomendado de isolamento utiliza os pools de aplicativos do Windows Server 2003 e oferece isolamento de processo, além de segurança de acesso ao código. No Windows 2000, o isolamento pode ser conseguido apenas por meio da segurança de acesso ao código e de identidades de segmento separadas.

Fazer a migração de um aplicativo para que ele seja executado com confiança total geralmente requer uma certa reengenharia. Talvez seja preciso fazer uma reengenharia no caso das fontes de acesso de aplicativos não serem permitidas por um nível de confiança parcial ou no caso de conjuntos com nomes de alta segurança que não contenham APTCA. Nesses casos, você pode colocar no modo seguro o acesso privilegiado a recursos em conjuntos wrapper separados. Em alguns casos, você pode criar e usar arquivos personalizados de diretivas, embora isso dependa da diretiva de segurança do seu servidor de Web.

Recomenda–se que, no projeto, o código de acesso ao recurso seja colocado em conjuntos separados e que se evite a colocação desse código em arquivos .aspx, bem como a colocação código por trás de arquivos. O uso de conjuntos separados permite que a diretiva de segurança de acesso ao código seja aplicada ao conjunto independentemente do aplicativo da Web, além de permitir que você desenvolva códigos confiáveis no modo seguro para ter acesso aos recursos.

Início da páginaInício da página

Outros recursos

Para obter mais informações, consulte os seguintes recursos:

"Security in .NET: The Security Infrastructure of the CLR Provides Evidence, Policy, Permissions, and Enforcement Services" no MSDN Magazine em http://msdn.microsoft.com/msdnmag/issues/02/09/SecurityinNET/default.aspx (em inglês)

"Security in .NET: Enforce Code Access Rights with the Common Language Runtime" no MSDN Magazine em http://msdn.microsoft.com/msdnmag/issues/01/02/CAS/default.aspx.(em inglês)

LaMacchia, Lange, Lyons, Martin, and Price .NET Framework Security. Addison Wesley Professional, 2002.

"Como: na seção "Como Fazer" deste guia".


Início da páginaInício da página