Uma exceção System.Security.SecurityException ocorre quando você tenta representar um usuário de um thread secundário em um aplicativo ASP.NET

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 842790
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sintomas
Em um aplicativo da Web Microsoft ASP.NET, ao tentar representar um usuário de um secundário secundário thread, um System.Security.SecurityException exceção pode ocorrer. Quando a exceção System.Security.SecurityException ocorrer, você receber a seguinte mensagem de erro:
Ocorreu uma exceção sem tratamento do tipo 'System.Security.SecurityException' no módulo desconhecido.
Obter informações adicionais: não é possível representar o usuário.
Esse comportamento ocorre se todas as seguintes condições forem verdadeiras:
  • Você habilitar a representação no arquivo Web.config do seu aplicativo.
  • No <processmodel> elemento do arquivo Machine.config, o valor do atributo userName é especificado como o computador para executar o processo de operador do ASP.NET no contexto de segurança da conta de usuário local ASPNET.
  • Usar a autenticação integrada do Windows para seu aplicativo.
Esse comportamento não ocorre no Microsoft Windows Server 2003 ou no Microsoft Windows 2000 Service Pack 4 (SP4).
Causa
Se você ativar a representação no arquivo Web.config do seu aplicativo ASP.NET, apenas o segmento principal do aplicativo representa o usuário que você especificou. O thread secundário e os outros threads que você iniciar no seu aplicativo usam o contexto de segurança da conta de usuário local ASPNET. No entanto, somente a conta de usuário representado pode acessar o objeto de segmento para o thread secundário. Porque a conta de usuário ASPNET não tem os direitos para acessar este objeto thread , você não pode representar um usuário do thread secundário.
Como Contornar
Para contornar este problema, use um dos seguintes métodos:
  • Chame a função RevertToSelf antes de iniciar o thread secundário.
  • Atribua o usuário funcionar como parte do sistema operacional para a direita para a conta de usuário ASPNET.
  • Alterar o valor do atributo userName do <processmodel> elemento no arquivo Machine.config.
Chamar a função RevertToSelf antes de iniciar o thread secundário
  1. Declare uma referência para a função RevertToSelf na DLL Advapi32.dll. Para fazer isso, localize o código a seguir:
    public class <WebFormName> : System.Web.UI.Page{
    Observação <WebFormName> é um espaço reservado para o nome do seu formulário da Web.
  2. Adicione o seguinte código após o código que você localizado:
    [DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]public static extern bool RevertToSelf();
  3. Localize o seguinte code:
    <ThreadObject>.Start()
    Observação <ThreadObject> é um espaço reservado para o nome do thread secundário.
  4. Adicione o seguinte código antes do código que localizado apenas:
    RevertToSelf();
Conceder o ACT como parte do usuário do sistema operacional para a direita para a ASPNET conta de usuário
  1. Abra o snap-in de diretiva de segurança local.
  2. No painel esquerdo do snap-in Diretiva de segurança local, expanda Diretivas locais e clique em Atribuição de direitos de usuário .
  3. Adicione a conta de usuário ASPNET.

    Se você estiver usando o Microsoft Windows XP, execute estas etapas:
    1. No painel à direita as configurações de segurança local encaixar - no, localize o campo de diretiva e, em seguida, clique duas vezes em funcionar como parte do sistema operacional . A caixa de diálogo funcionar como parte do sistema operacional propriedades será exibida.
    2. Clique em Adicionar usuário ou grupo . A caixa de diálogo Selecionar usuários ou grupos será exibida.
    3. Na caixa Digite os nomes de objeto a serem selecionados , digite ASPNET e, em seguida, clique em OK .
    4. Clique em OK e, em seguida, feche o snap-in Configurações locais de segurança.
    Se você estiver usando o Microsoft Windows 2000, execute estas etapas:
    1. No painel à direita as configurações de segurança local encaixar - no, localize o campo de diretiva e, em seguida, clique duas vezes em funcionar como parte do sistema operacional . A caixa de diálogo Local Security Policy Setting será exibida.
    2. Clique em Adicionar . A caixa de diálogo Selecionar usuários ou grupos será exibida.
    3. No campo nome , clique em ASPNET .
    4. Clique em Adicionar e, em seguida, clique em OK .
    5. Clique em OK e, em seguida, feche o snap-in Configurações locais de segurança.
Alterar o valor do atributo userName do elemento <processmodel> no arquivo Machine.config
  1. Use um editor de texto, como o bloco de notas para abrir o arquivo Machine.config. O arquivo Machine.config está localizado na pasta %WINDIR%\Microsoft.NET\Framework\v1.1.4322\Config ou na pasta %WINDIR%\Microsoft.NET\Framework\v1.1.3705\Config, dependendo da versão do Microsoft .NET Framework que você está usando.
  2. Localize o seguinte atributo do <processmodel> elemento:
    userName="Machine"
  3. Substituir o atributo localizado na etapa 2 com o seguinte atributo:
    userName="System"
Situação
Esse comportamento é por design.
Mais Informações

Etapas para reproduzir o comportamento

  1. Inicie o Microsoft Visual Studio NET..
  2. Usar o Microsoft Visual translation from VPE for Csharp .NET para criar uma Web do ASP.NET projeto de aplicativo chamada MyApp. Por padrão, um formulário da Web que é chamado WebForm1 é criado.
  3. No Solution Explorer, clique duas vezes em Web.config para abrir o arquivo Web.config.
  4. Localize o seguinte elemento no arquivo Web.config:
    <authentication mode="Windows"				/>
  5. Adicione o seguinte elemento após o elemento localizado na etapa 4:
    <identity				impersonate="true" userName="UserName"				password="Password" />
    Observação substituir UserName e Password com as credenciais do usuário que você deseja representar.
  6. No Solution Explorer, clique com o botão direito do mouse em WebForm1.aspx e, em seguida, clique em View Code para abrir o modo de exibição código do formulário da Web WebForm1.
  7. Adicione o seguinte código na parte superior da janela de código para importar os namespaces necessários:
    using System.Web.Security;using System.Security.Principal;using System.Runtime.InteropServices;using System.Threading;
  8. Localize o código a seguir:
    public class WebForm1 : System.Web.UI.Page{
  9. Adicione o seguinte código após o código localizado na etapa 8:
    // Declare a WindowsImpersonationContext object.WindowsImpersonationContext ImpersonationContext;
  10. Localize o código a seguir:
    // Put user code to initialize the page here.
  11. Substitua o código localizado na etapa 10 com o seguinte código:
    Response.Write("In the primary thread<br>");Thread oThread = new Thread(new ThreadStart(ThreadMethod));// Start the secondary thread.oThread.Start();Thread.Sleep(10000);
  12. Adicione o seguinte código antes da região Web Form Designer gerado código :
    public void ThreadMethod(){    try    {        Response.Write("In the secondary thread<br>");        // Try to impersonate a user.        ImpersonationContext = ((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate();        Response.Write("Successfully impersonated from a secondary thread");        ImpersonationContext.Undo();     }    catch(Exception e)    {        Response.Write("Exception : " + e.Message.ToString());    }}
  13. Verifique se seu aplicativo usa integrada do Windows autenticação.
  14. Criar e executar seu aplicativo. O comportamento mencionado na seção "Sintomas" pode ocorrer.
Referências
Para obter informações adicionais, clique nos números abaixo para ler os artigos na Base de dados de Conhecimento da Microsoft:
306158Implementar a representação em um aplicativo ASP.NET
319615 Mensagem de erro "Não é possível representar o usuário" quando você usa o método WindowsIdentity.Impersonate
Para obter mais informações, visite os seguintes sites do Microsoft Developer Network (MSDN) da:
Arquitetura de aplicativos para. NET: Projetando aplicativos e serviços
http://msdn2.microsoft.com/en-us/library/ms954595.aspx

Criando aplicativos ASP.NET seguros: Autenticação, autorização e comunicação segura
http://msdn2.microsoft.com/en-us/library/aa302415.aspx

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 842790 - Última Revisão: 12/08/2015 07:26:47 - Revisão: 2.5

Microsoft ASP.NET 1.1, Microsoft ASP.NET 1.0

  • kbnosurvey kbarchive kbmt kbinterop kbauthentication kbconfig kbwebforms kbuser kbsecurity kbwebserver kbclient kberrmsg kbprb KB842790 KbMtpt
Comentários