如何使用托管代码 (C#) 创建简单的 FTP 主目录提供程序

作者:Robert McMurray

Microsoft 创建了一个新的 FTP 服务,该服务针对 Windows Server® 2008 完全重新编写。 这种新的 FTP 服务包含许多新功能,使 Web 作者能够比以前更轻松地发布内容,并为 Web 管理员提供了更多的安全性和部署选项。

新的 FTP 7.5 服务支持扩展性,让你扩展 FTP 服务随附的内置功能。 更具体地说,FTP 7.5 支持创建你自己的身份验证和授权提供程序。 你还可以创建用于自定义 FTP 日志记录和确定 FTP 用户的主目录信息的提供程序。

本演练将引导你完成使用托管代码创建简单的 FTP 主目录提供程序的步骤。

先决条件

必须准备好以下各项才能完成本文中的过程:

  1. IIS 7.0 或更高版本必须安装在 Windows Server 2008 服务器上,并且必须安装 Internet Information Services (IIS) 管理器。

  2. 必须安装新的 FTP 7.5 服务。

  3. 你必须创建用于 FTP 发布的根文件夹。

  4. 你必须使用 Visual Studio 2008。

    注意

    如果你使用早期版本的 Visual Studio,则本演练中的某些步骤可能不正确。

  5. 必须为每个用户创建一个主目录;代码示例使用 C:\Ftpusers\%*UserName*%,但你可以根据需要更改它。

步骤 1:设置项目环境

在此步骤中,你将在 Visual Studio 2008 中为演示提供程序创建一个项目。

  1. 打开 Microsoft Visual Studio 2008。

  2. 依次单击“文件”菜单、“新建”、“项目”。

  3. 在“新建项目”对话框中执行以下操作:

    • 选择“Visual C#”作为项目类型
    • 选择“类库”作为模板。
    • 键入“FtpHomeDirectoryDemo”作为项目的名称。
    • 单击“确定”。
  4. 项目打开后,添加 FTP 扩展性库的引用路径:

    • 单击“项目”,然后单击“FtpHomeDirectoryDemo 属性”

    • 单击“引用路径”选项卡

    • 输入 Windows 版本的 FTP 扩展性程序集的路径,其中 C: 是操作系统驱动器:

      • 适用于 Windows Server 2008 和 Windows Vista:C:\Windows\assembly\GAC\_MSIL\Microsoft.Web.FtpServer\7.5.0.0\_\_31bf3856ad364e35
      • 适用于 Windows 7:C:\Program Files\Reference Assemblies\Microsoft\IIS
    • 单击“添加文件夹”。

  5. 为项目添加一个强名称密钥:

    • 单击“项目”,然后单击“FtpHomeDirectoryDemo 属性”
    • 单击“签名”选项卡。
    • 勾选“为程序集签名”复选框
    • 从强密钥名称下拉框中选择“<新建>”
    • 输入“FtpHomeDirectoryDemoKey”作为密钥文件名。
    • 根据需要输入密钥文件的密码;否则,请清除“使用密码保护我的密钥文件”复选框。
    • 单击“确定”。
  6. 可选:可以添加自定义生成事件,以将 DLL 自动添加到开发计算机上的全局程序集缓存 (GAC):

    • 单击“项目”,然后单击“FtpHomeDirectoryDemo 属性”

    • 单击“生成事件”选项卡

    • 在“生成后事件命令行”对话框中输入以下内容:

      net stop ftpsvc
      call "%VS90COMNTOOLS%\vsvars32.bat">null
      gacutil.exe /if "$(TargetPath)"
      net start ftpsvc
      
  7. 保存该项目。

步骤 2:创建扩展性类

在此步骤中,你将实现演示提供程序的扩展性接口。

  1. 为项目添加对 FTP 扩展性库的引用:

    • 单击“项目”,然后单击“添加引用”
    • 在“.NET”选项卡上,单击“Microsoft.Web.FtpServer”
    • 单击“确定”。
  2. 为项目添加对 System.Web 的引用:

    • 单击“项目”,然后单击“添加引用”
    • 在“.NET”选项卡上,单击“System.Web”
    • 单击“确定”。
  3. 添加身份验证类的代码:

    • 在“解决方案资源管理器”中,双击“Class1.cs”文件

    • 删除现有代码。

    • 在编辑器中粘贴以下代码:

      using System;
      using Microsoft.Web.FtpServer;
       
      namespace FtpHomeDirectory
      {
          public class FtpHomeDirDemo : BaseProvider,
              IFtpHomeDirectoryProvider
          {
              string IFtpHomeDirectoryProvider.GetUserHomeDirectoryData(
                  string sessionId,
                  string siteName,
                  string userName)
              {
                  // Note: You would add your own custom logic here.
                  // Return the user's home directory based on their user name.
                  return @"C:\Ftpusers\" + userName;
              }
          }
      }
      
  4. 保存并编译项目。

注意

如果你没有使用可选步骤在 GAC 中注册程序集,则需要手动将程序集复制到 IIS 计算机,并使用 Gacutil.exe 工具将程序集添加到 GAC。 有关详细信息,请参阅 Gacutil.exe(全局程序集缓存工具)一文。

步骤 3:将主目录提供程序添加到 FTP

在此步骤中,你将向 FTP 服务和默认网站添加演示提供程序。

  1. 确定扩展性提供程序的程序集信息:

    • 在 Windows 资源管理器中打开 C:\Windows\assembly 路径,其中 C: 是操作系统驱动器。
    • 找到 FtpHomeDirectoryDemo 程序集。
    • 右键单击该程序集,然后单击“属性”。
    • 复制“区域性”值,例如“Neutral”
    • 复制“版本”号,例如“1.0.0.0”
    • 复制“公钥令牌”值,例如“426f62526f636b73”
    • 单击“取消” 。
  2. 将扩展性提供程序添加到 FTP 提供程序的全局列表中:

    • 打开“Internet Information Services (IIS)管理器”

    • 在“连接”窗格中单击计算机名称

    • 双击主窗口中的“FTP 身份验证”

    • 在“操作”窗格中单击“自定义提供程序”

    • 单击“注册”。

    • 输入“FtpHomeDirectoryDemo”作为提供程序“名称”

    • 单击“托管提供程序(.NET)”

    • 使用之前复制的信息输入扩展性提供程序的程序集信息。 例如:

      FtpHomeDirectory.FtpHomeDirDemo,FtpHomeDirectoryDemo,version=1.0.0.0,Culture=neutral,PublicKeyToken=426f62526f636b73
      
    • 单击“确定”。

    • 清除提供程序列表中的“FtpHomeDirectoryDemo”复选框。

    • 单击“确定”。

  3. 将自定义提供程序添加到站点:

    • 目前没有 UI 允许你向站点添加自定义功能,因此必须使用以下命令行:

      AppCmd set site "Default Web Site" /+ftpServer.customFeatures.providers.[name='FtpHomeDirectoryDemo',enabled='true']
      
  4. 配置用户隔离以使用自定义提供程序:

    • 目前没有 UI 允许你指定用于用户隔离的自定义功能,因此必须使用以下命令行:

      AppCmd set site "Default Web Site" /ftpServer.userIsolation.mode:Custom
      

总结

在此演练中,你了解了如何执行以下操作:

  • 在 Visual Studio 2008 中为自定义 FTP 主目录提供程序创建项目。
  • 实现用于自定义 FTP 主目录查找的扩展性接口。
  • 将自定义主目录提供程序添加到 FTP 服务。

当用户连接到 FTP 站点时,FTP 服务会将每个用户的主目录设置为已在演示提供程序中指定的路径。