none
Acessar dados de um diretório protegido RRS feed

  • Pergunta

  • Pessoal, tenho uma pasta que tem o acesso protegido para determinado grupo de usuário, que está gerenciado pelo AD.

    Como faço para acessar os arquivos de dentro dessa pasta pelo .net?

    Fiz minha autenticação no sistema pelo AD e no webconfig o código

    <authentication mode="Forms"><br/>
    			<forms loginUrl="Login.aspx" name="adAuthCookie" timeout="1" path="/"><br/>
    			</forms><br/>
    		</authentication><br/>
    		<authorization><br/>
    			<deny users="?"/><br/>
    			<allow users="*"/><br/>
    		</authorization><br/>
    		<identity impersonate="true"/>
    

    Ao que parece, o IIS não usa o usuário autenticado para acessar o arquivo físico.

    Para acessar o arquivo estou usando o seguinte código

    Response.ContentType = "application/zip";
          Response.WriteFile("\\\\servidor\\diretorio\\arquivo.zip");
    
    Alguém já passou por isso?

    terça-feira, 15 de março de 2011 17:20

Respostas

  • Pessoal é o seguinte, consegui resolver o problema com uma ajuda do site da microsoft, para acessar um diretório protegido ou algum arquivo protegido somente para um grupo de usuário ou usuário específico.

    O IIS usa um usuário específico para acesso aos arquivos, o que você terá de fazer basicamente é trocar esse usuário no momento em que for acessar o arquivo, em seguida, voltar desfazer essa operação.

    Para isso, você terá que usar os métodos:

    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);
    
        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();
        }
    

     

    Agora, para acessar o arquivo faça o seguinte:

     

    if (impersonateValidUser("usuário", "domínio", "senha"))
          {
            Response.ContentType = "application/pdf";
            Response.WriteFile("\\\\servidor\\diretorio\\arquivo.pdf", true);
            Response.End();
            undoImpersonation();
          }
    

     

    Aí é só correr pro abraço :)

    Obrigado pessoal

    • Marcado como Resposta Rique Costa quarta-feira, 16 de março de 2011 10:56
    quarta-feira, 16 de março de 2011 10:56

Todas as Respostas

  • Só pra constar, não posso dar acesso total para o IIS nesse dir, logo, preciso recuperar os dados com o usuário/senha que já tenho
    terça-feira, 15 de março de 2011 17:32
  • Olá Rique,

    Você pode verificar as permissões de acesso antes de gravar alguma coisa. Veja o link abaixo:

    http://stackoverflow.com/questions/130617/how-do-you-check-for-permissions-to-write-to-a-directory-or-file

    terça-feira, 15 de março de 2011 20:14
  • Pessoal é o seguinte, consegui resolver o problema com uma ajuda do site da microsoft, para acessar um diretório protegido ou algum arquivo protegido somente para um grupo de usuário ou usuário específico.

    O IIS usa um usuário específico para acesso aos arquivos, o que você terá de fazer basicamente é trocar esse usuário no momento em que for acessar o arquivo, em seguida, voltar desfazer essa operação.

    Para isso, você terá que usar os métodos:

    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);
    
        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();
        }
    

     

    Agora, para acessar o arquivo faça o seguinte:

     

    if (impersonateValidUser("usuário", "domínio", "senha"))
          {
            Response.ContentType = "application/pdf";
            Response.WriteFile("\\\\servidor\\diretorio\\arquivo.pdf", true);
            Response.End();
            undoImpersonation();
          }
    

     

    Aí é só correr pro abraço :)

    Obrigado pessoal

    • Marcado como Resposta Rique Costa quarta-feira, 16 de março de 2011 10:56
    quarta-feira, 16 de março de 2011 10:56