Trabalhando com Ipersonate e Web


por Mauricio Junior em 1/1/2011 0

        Olá pessoal,depois de ter o privilégio de mais um ano de vida quero mostrar como usar o ipersonate via web no seu aplicativo ouda empresa. Mas antes, veja com atenção atenção sobre o contexto que estou abordandoe desenvolvendo o software.

 

Referência que estou usando:

Linguagem C#.NET

Ferramenta: VisualStudio .NET 2008

Framework 3.5

Plataforma:ASP.NET

 

Contexto 1:

         Tenho um servidor que está na internet,ou seja, tem ip fixo, tem sites instalados, tem IIS instalado e configurado.Tenho outro servidor que serve para uso interno, isto é, não está na internet,mas estão na mesma rede. Só tem IP interno e não tem externo e para entrarnele, preciso apenas de um usuário com permissão de acesso a determinada pasta.

 

Contexto 2:

         A aplicação que tenho hoje gera um pdfcom assinatura digital e joga o mesmo no servidor interno, ou seja, não tenhoacesso via web para acessar estes arquivos, no caso de querer visualizá-lospela internet, browser ou outra ferramenta.

 

Contexto 3:

         Devido o contexto 1 e 2, preciso usarum usuário que tenha acesso a determinada pasta onde estão os arquivos. Lembrandoque estes artigos estão em um servidor interno e a minha aplicação web está emum servidor na internet, na mesma rede.

         Para ter este tipo de acesso, precisode um usuário da rede com permissão a pasta e assim conseguir mostrar osarquivos pelo sistema web acessando com usuário local. Esse acessar com ousuário da rede é necessário fazer um ipersonate.Para quem não sabe, é usar um usuário específico para acessar determinado localem vez de usar o usuário da web.

 

         Depois de toda essa explicação, queromostrar passo a passo como fazer o ipersonateno sistema web com objetivo de acessar um determinado local com usuárioespecífico. Geralmente usamos isso em empresas.

 

Código

         O primeiro passo é importar algumasclasses do framework .net. No meu caso estou usando a versão 3.5. (Code 1)

 

 

using System.Security;

using System.Security.Principal;

using System.Runtime;

using System.Runtime.InteropServices;

using System.Web;

using System.Web.Security;

Code 1

 

         O segundo passo é usar algumas dll’s dosistema operacional Windows para fazer este logon. Criei algumas constantes deusuário, senha e domínio que você ter. (Code 2)

 

 

        #region "   Impersonate   "

 

        [System.Runtime.InteropServices.DllImport("advapi32.dll")]

        public static extern int LogonUser(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);

 

        const int LOGON32_PROVIDER_DEFAULT = 0;

        const int LOGON32_LOGON_INTERACTIVE = 2;

 

        static WindowsImpersonationContext wic;

        const string User = "seu_usuario";

        const string Domain = "seu_dominio";

        const string Pwd = "sua_senha";

 

        #endregion

 

Code 2

 

         O terceiro passo é criar um método queloga utilizando as credenciais do usuário local, ou seja, aquele que coloqueinas constantes. O método precisa passar alguns parâmetros de entrada. Resolvicriar um método estático para não precisar criar um “new” ou uma novainstância. (Code 3)

 

 

static public bool ImpersonateValidUser(String userName, String domain, String password)

        {

            WindowsIdentity wi;

            IntPtr token = IntPtr.Zero;

            IntPtr tokenDuplicate = IntPtr.Zero;

 

            if (RevertToSelf())

            {

                if (LogonUser(userName, domain, password, LOGON32_LOGON_INTERACTIVE,

                    LOGON32_PROVIDER_DEFAULT, ref token) != 0)

                {

                    if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)

                    {

                        wi = new WindowsIdentity(tokenDuplicate);

                        wic = wi.Impersonate();

                        if (wic != null)

                        {

                            CloseHandle(token);

                            CloseHandle(tokenDuplicate);

                            return true;

                        }

                    }

                }

            }

            if (token != IntPtr.Zero)

                CloseHandle(token);

            if (tokenDuplicate != IntPtr.Zero)

                CloseHandle(tokenDuplicate);

            return false;

        }

 

Code 3

 

         O quarto e último passo usei oLoad_Page da página criada para fazer tudo que criamos anteriormente com poucaslinhas de código. Chamei o método (code 3) e usei a variável falando para usaro usuário local e abrir o arquivo. (Code 4)

 

 

            if (ImpersonateValidUser(User, Domain, Pwd))

            {

                using (wic)

                {

                }

            }

Code 4

 

         Note que usei as constantes de usuário,domínio e senha, depois coloquei “using (wic)” que constitui da variável dousuário logado localmente. Dentro do using (wic) coloquei o código que chama oarquivo pdf dinamicamente e dessa forma o arquivo é mostrado sem qualquerproblema. (Imagem 1)

         Tudo que for escrito dentro do using(wic) será feito com o usuário do ipersonate.

 

Imagem 1 (clique na imagem para ampliar)

 

Bom,eu fico por aqui e espero que tenha entendido tudo sobre o artigo. Nãoexpliquei o que fiz dentro do método para não prolongar muito o artigo. Oobjetivo foi ser “objetivo”.

 

Qualquer dúvidapode entrar em contato pelo site.

Mauricio Junior.

www.mauriciojunior.org.

 

voltar   comente  subir

 
Mauricio Junior Formado pela Faculdade Anhanguera, Especialista pela FGV (Fundação Getúlio Vargas), Pós-Graduação em Docência Superior e cursando Mestrado na UNB Engenharia Elétrica; .
Tenho 29 anos e possuo sete livros publicados pela editora Ciência Moderna. Sou Certificado Microsoft MCP, MCAD e MVP, faço parte da comunidade ASPNETI.COM, ECODE10.COM, onde publico artigos, vídeos, ebooks e livros Publico artigos, vídeos e podcast em outras comunidades. Trabalho como Analista de Sistemas / Desenvolvedor na empresa ATP S/A. Blog: blog.mauriciojunior.org, Site pessoal www.mauriciojunior.org



Comentários:

Comente (dê sua opinião):
Comentário:
Código Imagem:  (digite o código da imagem respeitando maiúsculo e minúsculo)

Favor digitar o código da imagem para cadastramento.

 

Outros Artigos do Autor

Vídeo - Ler EventLog do Windows usando C#.NET
XAML Power Toys
Chart - novo componente integrado Visual Studio .NET 2010
Java J2EE – Primeiro Passo
Linha do GridView (colorindo ao passar o mouse)
Sistema que faz busca no google
ASP.NET MVC
Enviando E-mail com Anexo
Apresentação do Windows
Trabalhando com GridView e RowCommand
Vídeo: Análise do Android 3.0 por um especialista
ListBox componente básico
Dica: Pegar extensão, nome do arquivo e pasta
Vídeo - Serviços do Windows Live
Vídeo - Mostrando um sistema com pocket pc
Comunicação .NET e VB 6.0 – Parte I
Ajax com C#.NET (parte 1)
Filtrar o DataTable Dinamicamente
Sistema de Login em ASP – Parte V
SELECT INSERT
Dica Importante SQL Server 2008 Management Studio
C# - Da introdução ao primeiro projeto-1
Gravando Erros com Exception no arquivo de log - Parte II
Virtual Earth - Segundo Passo
Deixando o rodapé fixo
SQLEngine Utilizando Upgrade
Inserindo no Sql Server
Servidor Integrado - Visual Studio.NET
Token e Sessão Corrente com C#.NET
Paginação no GridView
Sort no GridView sem ir ao banco de dados novamente
Gerando uma dll com sistema web
Ebook: Aprendendo Desenvolver WebServices
SmartNavigation – 1.0 e 1.1 MaintainScroll PositionOn Postback – 2.0
Visual SourceSafe