Compartir a través de


Cómo usar código administrado (C#) para crear un proveedor FTP que impida el leeching

por Robert McMurray

[Esta documentación es preliminar y es susceptible de cambio].

Compatibilidad

Versión Notas
IIS 8.0 El servicio FTP 8.0 es necesario para el control de eventos FTP personalizado.
IIS 7.5 El control de eventos FTP personalizado no se admite en FTP 7.5 para IIS 7.5.
IIS 7.0 El control de eventos FTP personalizado no se admite en FTP 7.0 para IIS 7.0.

Nota: El servicio FTP 8.0 se distribuye como una característica para IIS 8.0 en Windows 8 y Windows 8 Server.

Introducción

Microsoft ha creado un nuevo servicio FTP 8.0 para Windows Server® 2012 que se basa en el amplio conjunto de características que se introdujeron en FTP 7.0 y FTP 7.5. Además, este nuevo servicio FTP amplía la lista de interfaces de programación de aplicaciones (API) para FTP con nuevas características de extensibilidad, como la compatibilidad con la autorización personalizada y el procesamiento de eventos simple.

Teniendo esto en cuenta, este tutorial le llevará a través de los pasos para usar código administrado para crear un proveedor FTP simple que impida que los usuarios descarguen más archivos por sesión de los que desea permitir, que es un comportamiento que se conoce como "leeching". El proveedor FTP de este tutorial implementa los métodos IFtpPreprocessProvider.HandlePreprocess() y IFtpPostprocessProvider.HandlePostprocess() para restringir un usuario a un número máximo de descargas que especifique en la entrada del proveedor en el archivo ApplicationHost.config.

Requisitos previos

Los siguientes elementos son necesarios para completar los procedimientos de esta sección:

  1. IIS 8.0 debe estar instalado en el servidor de Windows Server 2012 y también se debe instalar el Administrador de Internet Information Services (IIS).
  2. El nuevo servicio FTP 8.0 debe estar instalado.
  3. Debe instalar Visual Studio.

Nota: Este tutorial se escribió con Visual Studio 2010. Puede usar otras versiones de Visual Studio, pero es posible que algunos de los pasos de este tutorial no sean exactos.

Paso 1: configurar el entorno del proyecto

En este paso, creará un proyecto en Visual Studio 2010 para el proveedor de demostración.

  1. Abra Microsoft Visual Studio 2010.

  2. Haga clic en el menú Archivo y, a continuación, Nuevo y, luego, en Proyecto.

  3. En el cuadro de diálogo Nuevo proyecto:

    • Elija Visual C# como tipo de proyecto.
    • Elija Biblioteca de clases como plantilla.
    • Escriba FtpLeechPrevention como nombre del proyecto.
    • Haga clic en OK.
  4. Agregue al proyecto una clave de nombre seguro:

    • Haga clic en Proyecto y, a continuación, haga clic en Propiedades FtpLeechPrevention.
    • Haga clic en la pestaña Firma.
    • Marque la casilla Firmar el ensamblado.
    • Elija <Nuevo...> en el cuadro desplegable de nombre de clave segura.
    • Escriba FtpLeechPreventionKey para el nombre del archivo de clave.
    • Si lo desea, escriba una contraseña para el archivo de clave; de lo contrario, desactive la casilla Proteger mi archivo de clave con una contraseña.
    • Haga clic en OK.
  5. Agregue un evento de compilación personalizado para agregar el archivo DLL automáticamente a la caché global de ensamblados (GAC) en el equipo de desarrollo:

    • Haga clic en Proyecto y, a continuación, haga clic en Propiedades FtpLeechPrevention.

    • Haga clic en la pestaña Eventos de compilación.

    • En el cuadro de diálogo Línea de comandos del evento posterior a la compilación, escriba el siguiente comando:

      net stop ftpsvc
      call "%VS100COMNTOOLS%\vsvars32.bat">nul
      gacutil.exe /if "$(TargetPath)"
      net start ftpsvc
      
  6. Guarde el proyecto.

Paso 2: crear la clase de extensibilidad

En este paso, implementará la interfaz de extensibilidad para el proveedor de demostración.

  1. Agregue una referencia a la biblioteca de extensibilidad FTP para el proyecto:

    • Haga clic en Proyecto y después haga clic en Agregar referencia...
    • Haga clic en la pestaña Examinar.
    • Vaya a la carpeta %ProgramFiles(x86)%\Reference Assemblies\Microsoft\IIS.
    • Haga clic en Microsoft.Web.FtpServer y, a continuación, haga clic en Aceptar.
  2. Agregue el código para la clase de autenticación:

    • En el Explorador de soluciones, haga doble clic en el archivo Class1.cs.

    • Elimine el código existente.

    • Pegue el siguiente código en el editor:

      using System;
      using System.Collections;
      using System.Collections.Generic;
      using System.Collections.Specialized;
      using Microsoft.Web.FtpServer;
      
      public class FtpLeechPrevention :
        BaseProvider,
        IFtpPreprocessProvider,
        IFtpPostprocessProvider,
        IFtpLogProvider
      {
        private static Dictionary<string, int> _sessionList = null;
        private static int _maxDownloads = 1;
      
        protected override void Initialize(StringDictionary config)
        {
          // Test if the dictionary has been created.
          if (_sessionList == null)
          {
            // Create the dictionary if it hasn't been created.
            _sessionList = new Dictionary<string, int>();
          }
          // Retrieve the max downloads from configuration.
          if (string.IsNullOrEmpty(config["MaxDownloads"]) == false)
            _maxDownloads = Convert.ToInt16(config["MaxDownloads"]);
        }
      
        public FtpProcessStatus HandlePreprocess(
          FtpPreprocessParameters preProcessParameters)
        {
          // Test if the command was a RETR command.
          if (preProcessParameters.Command.Equals(
            "RETR", StringComparison.InvariantCultureIgnoreCase))
          {
            // Test if the max download count was exceeded.
            if (_sessionList[preProcessParameters.SessionId].Equals(_maxDownloads))
            {
              // Reject the command if the max download count was exceeded.
              return FtpProcessStatus.FtpProcessRejectCommand;
            }
          }
          return FtpProcessStatus.FtpProcessContinue;
        }
      
        public FtpProcessStatus HandlePostprocess(
          FtpPostprocessParameters postProcessParameters)
        {
          // Test if the command was a successful RETR command.
          if (postProcessParameters.Command.Equals(
            "RETR", StringComparison.InvariantCultureIgnoreCase) &&
            postProcessParameters.FtpStatus == 226)
          {
            // Increment the download count.
            _sessionList[postProcessParameters.SessionId]++;
          }
          return FtpProcessStatus.FtpProcessContinue;
        }
      
        public void Log(FtpLogEntry logEntry)
        {
          // Test if the control channel was opened.
          if (logEntry.Command.Equals(
            "ControlChannelOpened",
            StringComparison.InvariantCultureIgnoreCase))
          {
            // Add the current session to the dictionary.
            _sessionList.Add(logEntry.SessionId, 0);
          }
          // Test if the control channel was closed.
          if (logEntry.Command.Equals(
            "ControlChannelClosed",
            StringComparison.InvariantCultureIgnoreCase))
          {
            // Remove the current session from the dictionary.
            _sessionList.Remove(logEntry.SessionId);
          }
        }
      }
      
  3. Guarde el proyecto y compílelo.

Nota:

Si no ha usado los pasos opcionales para registrar los ensamblados en la GAC, deberá copiar manualmente los ensamblados en el equipo de IIS 8.0 y agregar los ensamblados a la GAC mediante la herramienta Gacutil.exe. Para obtener más información, consulte el artículo siguiente:

Paso 3: Adición del proveedor personalizado a FTP

En este paso, agregará el proveedor de demostración al servicio FTP y un sitio FTP.

  1. Determine la información del ensamblado para el proveedor de extensibilidad:

    • Abra un símbolo del sistema y escriba los siguientes comandos:

      call "%VS100COMNTOOLS%\vsvars32.bat"
      
      gacutil.exe /l FtpLeechPrevention
      
    • Copie la información del ensamblado FtpLeechPrevention; por ejemplo:

      FtpLeechPrevention, Version=1.0.0.0, Culture=neutral, PublicKeyToken=426f62526f636b73
      
    • Cierre el .

  2. Agregue el proveedor de extensibilidad a la lista global de proveedores FTP:

    • En este momento no hay ninguna interfaz de usuario que le permita agregar un proveedor personalizado con sus opciones de configuración relacionadas a IIS, por lo que tendrá que usar la sintaxis de la línea de comandos como en el ejemplo siguiente:

      cd /d "%WinDir%\System32\Inetsrv"
      
      appcmd.exe set config -section:system.ftpServer/providerDefinitions /+"[name='FtpLeechPrevention',type='FtpLeechPrevention,FtpLeechPrevention,version=1.0.0.0,Culture=neutral,PublicKeyToken=426f62526f636b73']" /commit:apphost
      
      appcmd.exe set config -section:system.ftpServer/providerDefinitions /+"activation.[name='FtpLeechPrevention']" /commit:apphost
      
      appcmd.exe set config -section:system.ftpServer/providerDefinitions /+"activation.[name='FtpLeechPrevention'].[key='MaxDownloads',value='5']" /commit:apphost
      

      Nota:

      Debe actualizar la sintaxis anterior mediante la información de tipo administrado para el proveedor y el número deseado de descargas.

  3. Agregue el proveedor personalizado a un sitio:

    • En este momento no hay ninguna interfaz de usuario que le permita agregar características personalizadas a un sitio, por lo que tendrá que usar la sintaxis de la línea de comandos como el ejemplo siguiente que configura el sitio web predeterminado:

      cd /d "%WinDir%\System32\Inetsrv"
      
      appcmd.exe set site "Default Web Site" /+ftpServer.customFeatures.providers.[name='FtpLeechPrevention',enabled='true'] /commit:apphost
      

Resumen

En este tutorial ha aprendido a:

  • Crear un proyecto en Visual Studio 2010 para un proveedor FTP personalizado.
  • Implementar la interfaz de extensibilidad para la funcionalidad de FTP personalizada.
  • Agregar un proveedor personalizado al servicio FTP.

Cuando un cliente FTP se conecta al servicio FTP, el proveedor de FTP contará el número de veces que un cliente FTP descarga un archivo y evita que el usuario descargue más archivos por sesión de los que ha permitido en las opciones de configuración.