Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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:
- 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).
- El nuevo servicio FTP 8.0 debe estar instalado.
- 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.
Abra Microsoft Visual Studio 2010.
Haga clic en el menú Archivo y, a continuación, Nuevo y, luego, en Proyecto.
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.
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.
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
Guarde el proyecto.
Paso 2: crear la clase de extensibilidad
En este paso, implementará la interfaz de extensibilidad para el proveedor de demostración.
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.
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); } } }
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.
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 .
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.
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.