Você está offline; aguardando reconexão

Como implementar a representação em um aplicativo ASP.NET

IMPORTANTE: Este artigo foi traduzido pelo software de tradução automática da Microsoft e eventualmente pode ter sido editado pela Microsoft Community através da tecnologia Community Translation Framework (CTF) ou por um tradutor profissional. A Microsoft oferece artigos traduzidos automaticamente por software, por tradutores profissionais e editados pela comunidade para que você tenha acesso a todos os artigos de nossa Base de Conhecimento em diversos idiomas. No entanto, um artigo traduzido pode conter erros de vocabulário, sintaxe e/ou gramática. A Microsoft não é responsável por qualquer inexatidão, erro ou dano causado por qualquer tradução imprecisa do conteúdo ou por seu uso pelos nossos clientes.

Clique aqui para ver a versão em Inglês deste artigo: 306158
Este artigo refere-se ao seguinte .NET da Microsoft Namespaces da biblioteca de classes do Framework:
  • System.Web.Security
  • System.Security.Principal
  • System.Runtime.InteropServices
Sumário
Este artigo descreve as diferentes maneiras de implementar representação em um aplicativo ASP.NET.
Mais Informações
Se você quiser representar um usuário em um thread no ASP.NET, Você pode usar um dos seguintes métodos, com base em seus requisitos:
Observação Você pode usar o código a seguir para determinar qual usuário o segmento está em execução como:
System.Security.Principal.WindowsIdentity.GetCurrent().Name				

Representar o autenticada do IIS conta ou usuário

Para representar os Serviços de Informações da Internet da Microsoft (IIS) autenticação de usuário em cada solicitação para cada página em um aplicativo ASP.NET, Você deve incluir um <identity></identity> de marca no arquivo Web. config do aplicativo e defina o atributo impersonate para true. Por exemplo:
<identity impersonate="true" />				
Voltar ao início

Representar um usuário específico para todas as solicitações de um aplicativo ASP.NET

Para representar um usuário específico para todas as solicitações em todas as páginas de um aplicativo ASP.NET, você pode especificar os atributos userName e password na <identity></identity> a marca do arquivo Web. config do aplicativo. Por exemplo:
<identity impersonate="true" userName="accountname" password="password" />				
Observação A identidade do processo que representa um usuário específico no um segmento deve ter o privilégio "Funcionar como parte do sistema operacional". Por padrão, o processo de Aspnet_wp.exe é executado sob uma conta de computador chamada ASPNET. No entanto, essa conta não tem os privilégios necessários para representar um usuário específico. Você recebe uma mensagem de erro se tentar representar um usuário específico. Essas informações se aplicam somente para o.NET Framework 1.0. Isso privilégio não é necessário para o.NET Framework 1.1.

Como solução alternativa para Esse problema, use um dos seguintes métodos:
  • Conceder o privilégio "Funcionar como parte do sistema operacional" a conta ASPNET (a conta menos privilegiada).

    Observação Embora você possa usar esse método para solucionar o problema, A Microsoft não recomenda esse método.
  • Alterar a conta que executa o processo de Aspnet_wp.exe sob o sistema de conta na seção de configuração <processModel> do arquivo Machine. config.</processModel>
Voltar ao início

Representar o usuário de autenticação no código

Para representar o usuário de autenticação (Identity) somente quando você executa uma determinada seção de código, você pode usar o código a seguir. Este método requer que a identidade do usuário de autenticação do tipo WindowsIdentity.

Visual Basic .NET
Dim impersonationContext As System.Security.Principal.WindowsImpersonationContextDim currentWindowsIdentity As System.Security.Principal.WindowsIdentitycurrentWindowsIdentity = CType(User.Identity, System.Security.Principal.WindowsIdentity)impersonationContext = currentWindowsIdentity.Impersonate()'Insert your code that runs under the security context of the authenticating user here.impersonationContext.Undo()				
Visual C# .NET
System.Security.Principal.WindowsImpersonationContext impersonationContext;impersonationContext =     ((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate();//Insert your code that runs under the security context of the authenticating user here.impersonationContext.Undo();				
Visual j# .NET
System.Security.Principal.WindowsImpersonationContext impersonationContext;impersonationContext =     ((System.Security.Principal.WindowsIdentity)get_User().get_Identity()).Impersonate();//Insert your code that runs under the security context of the authenticating user here.impersonationContext.Undo();				
Voltar ao início

Representar um usuário específico no código

Para representar um usuário específico somente quando você executar uma determinada seção de código, use o seguinte código:

Visual Basic .NET
<%@ Page Language="VB" %><%@ Import Namespace = "System.Web" %><%@ Import Namespace = "System.Web.Security" %><%@ Import Namespace = "System.Security.Principal" %><%@ Import Namespace = "System.Runtime.InteropServices" %><script runat=server>Dim LOGON32_LOGON_INTERACTIVE As Integer = 2Dim LOGON32_PROVIDER_DEFAULT As Integer = 0Dim impersonationContext As WindowsImpersonationContextDeclare Function LogonUserA Lib "advapi32.dll" (ByVal lpszUsername As String, _                        ByVal lpszDomain As String, _                        ByVal lpszPassword As String, _                        ByVal dwLogonType As Integer, _                        ByVal dwLogonProvider As Integer, _                        ByRef phToken As IntPtr) As IntegerDeclare Auto Function DuplicateToken Lib "advapi32.dll" ( _                        ByVal ExistingTokenHandle As IntPtr, _                        ByVal ImpersonationLevel As Integer, _                        ByRef DuplicateTokenHandle As IntPtr) As IntegerDeclare Auto Function RevertToSelf Lib "advapi32.dll" () As LongDeclare Auto Function CloseHandle Lib "kernel32.dll" (ByVal handle As IntPtr) As LongPublic Sub Page_Load(ByVal s As Object, ByVal e As EventArgs)    If impersonateValidUser("username", "domain", "password") Then        'Insert your code that runs under the security context of a specific user here.        undoImpersonation()    Else        'Your impersonation failed. Therefore, include a fail-safe mechanism here.    End IfEnd SubPrivate Function impersonateValidUser(ByVal userName As String, _ByVal domain As String, ByVal password As String) As Boolean    Dim tempWindowsIdentity As WindowsIdentity    Dim token As IntPtr = IntPtr.Zero    Dim tokenDuplicate As IntPtr = IntPtr.Zero    impersonateValidUser = False    If RevertToSelf() Then        If LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE,                      LOGON32_PROVIDER_DEFAULT, token) <> 0 Then            If DuplicateToken(token, 2, tokenDuplicate) <> 0 Then                tempWindowsIdentity = New WindowsIdentity(tokenDuplicate)                impersonationContext = tempWindowsIdentity.Impersonate()                If Not impersonationContext Is Nothing Then                    impersonateValidUser = True                End If            End If        End If    End If    If Not tokenDuplicate.Equals(IntPtr.Zero) Then        CloseHandle(tokenDuplicate)    End If    If Not token.Equals(IntPtr.Zero) Then        CloseHandle(token)    End IfEnd FunctionPrivate Sub undoImpersonation()    impersonationContext.Undo()End Sub</script>
Visual C# .NET
<%@ Page Language="C#"%><%@ Import Namespace = "System.Web" %><%@ Import Namespace = "System.Web.Security" %><%@ Import Namespace = "System.Security.Principal" %><%@ Import Namespace = "System.Runtime.InteropServices" %><script runat=server>public const int LOGON32_LOGON_INTERACTIVE = 2;public const int LOGON32_PROVIDER_DEFAULT = 0;WindowsImpersonationContext impersonationContext; [DllImport("advapi32.dll")]public static extern int LogonUserA(String lpszUserName, 	String lpszDomain,	String lpszPassword,	int dwLogonType, 	int dwLogonProvider,	ref IntPtr phToken);[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]public static extern int DuplicateToken(IntPtr hToken, 	int impersonationLevel,  	ref IntPtr hNewToken);                          [DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]public static extern bool RevertToSelf();[DllImport("kernel32.dll", CharSet=CharSet.Auto)]public static extern  bool CloseHandle(IntPtr handle);public void Page_Load(Object s, EventArgs e){	if(impersonateValidUser("username", "domain", "password"))	{		//Insert your code that runs under the security context of a specific user here.		undoImpersonation();	}	else	{		//Your impersonation failed. Therefore, include a fail-safe mechanism here.	}}private bool impersonateValidUser(String userName, String domain, String password){	WindowsIdentity tempWindowsIdentity;	IntPtr token = IntPtr.Zero;	IntPtr tokenDuplicate = IntPtr.Zero;	if(RevertToSelf())	{		if(LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE, 			LOGON32_PROVIDER_DEFAULT, ref token) != 0)		{			if(DuplicateToken(token, 2, ref tokenDuplicate) != 0) 			{				tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);				impersonationContext = tempWindowsIdentity.Impersonate();				if (impersonationContext != null)				{					CloseHandle(token);					CloseHandle(tokenDuplicate);					return true;				}			}		} 	}	if(token!= IntPtr.Zero)		CloseHandle(token);	if(tokenDuplicate!=IntPtr.Zero)		CloseHandle(tokenDuplicate);	return false;}private void undoImpersonation(){	impersonationContext.Undo();}</script>
Visual j# .NET
<%@ Page language="VJ#" %><%@ Import Namespace="System.Web" %><%@ Import Namespace="System.Web.Security" %><%@ Import Namespace="System.Security.Principal" %><%@ Import Namespace="System.Runtime.InteropServices" %><script runat=server>public static int LOGON32_LOGON_INTERACTIVE = 2;public static int LOGON32_PROVIDER_DEFAULT = 0;WindowsImpersonationContext impersonationContext; /** @attribute DllImport("advapi32.dll") */ public static native int LogonUserA(String lpszUserName, 	String lpszDomain, 	String lpszPassword,	int dwLogonType, 	int dwLogonProvider, 	System.IntPtr[] phToken);/** @attribute DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true) */ public static native int DuplicateToken(System.IntPtr hToken,	int impersonationLevel,	System.IntPtr[] hNewToken);/** @attribute DllImport("kernel32.dll",CharSet=CharSet.Auto) */ public static native  boolean CloseHandle(System.IntPtr[] handle);/** @attribute DllImport("advapi32.dll", 	 CharSet=CharSet.Auto,SetLastError=true) */	 public static native boolean RevertToSelf();public void Page_Load(Object s, System.EventArgs e){	if(impersonateValidUser("username", "domain", " password"))	{		//Insert your code that runs under the security context of a specific user here.		undoImpersonation();	}	else	{		//Your impersonation failed. Therefore, include a fail-safe mechanism here.	}}private boolean impersonateValidUser(String userName, String domain, String password){	WindowsIdentity tempWindowsIdentity;	System.IntPtr[] token = new System.IntPtr[1];	System.IntPtr[] tokenDuplicate = new System.IntPtr[1];	if(RevertToSelf())	{		if(LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE, 			LOGON32_PROVIDER_DEFAULT, token) != 0)		{			if(DuplicateToken(token[0], 2, tokenDuplicate) != 0) 			{				tempWindowsIdentity = new WindowsIdentity(tokenDuplicate[0]);				impersonationContext = tempWindowsIdentity.Impersonate();				if (impersonationContext != null)				{					CloseHandle(tokenDuplicate);					CloseHandle(token);					return true;				}							}					} 	}	if(!token[0].Equals(System.IntPtr.Zero))		CloseHandle(token);	if(!tokenDuplicate[0].Equals(System.IntPtr.Zero))		CloseHandle(tokenDuplicate);	return false;}private void undoImpersonation(){	impersonationContext.Undo();}</script>				
Observação A identidade do processo que representa um usuário específico no um segmento deve ter o privilégio "Funcionar como parte do sistema operacional" Se o processo de Aspnet_wp.exe é executado em um computador baseado no Microsoft Windows 2000. O Privilégio "Funcionar como parte do sistema operacional" não é necessário se a Processo de aspnet_wp.exe está sendo executado em um computador baseado no Windows XP ou em um servidor Windows computador baseado em 2003. Por padrão, o Aspnet_wp.exe processo é executado sob uma conta de computador chamada ASPNET. No entanto, essa conta faz não tem os privilégios necessários para representar um usuário específico. Você recebe um mensagem de erro se tentar representar um usuário específico. .

Para contornar esse problema, use um dos seguintes métodos:
  • Conceder o privilégio "Funcionar como parte do sistema operacional" a conta ASPNET.

    Observação Não recomendamos esse método como solução alternativa para o problema.
  • Alterar a conta que executa o processo de Aspnet_wp.exe sob o sistema de conta na seção de configuração <processModel> do arquivo Machine. config.</processModel>
volta para o superior
Referências
Para obter informações adicionais sobre Segurança do ASP.NET, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
306590Visão geral sobre a segurança do ASP.NET
Falha de logon null (nulo) representar

Propriedades

ID do Artigo: 306158 - Última Revisão: 06/07/2013 10:41:00 - Revisão: 5.0

Microsoft ASP.NET 1.0, Microsoft ASP.NET 1.1, Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Visual C# .NET 2002 Standard Edition, Microsoft Visual C# .NET 2003 Standard Edition, Microsoft Visual J# .NET 2003 Standard Edition

  • kbinfo kbsecurity kbmt KB306158 KbMtpt
Comentários
ms.js">