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.