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.