ネイティブ コード (C++) を使用して単純な FTP 認証プロバイダーを作成する方法

公開日: 2009 年 3 月 18 日 (作業者: iisteam (英語))

更新日: 2009 年 9 月 11 日 (作業者: iisteam (英語))

マイクロソフトでは、Windows Server® 2008 用に完全に書き換えた新しい FTP サービスを作成しました。この新しい FTP サービスでは多くの新機能が追加され、Web サイト作成者は簡単にコンテンツを発行でき、Web 管理者は多くのセキュリティ オプションと展開オプションを使用できます。

この新しい FTP 7.5 サービスでは、FTP サービスに付属の組み込み機能の拡張を可能にする拡張機能がサポートされます。具体的には、FTP 7.5 で、独自の認証プロバイダーおよび承認プロバイダーの作成がサポートされます。さらに、カスタム FTP ログ作成および FTP ユーザーのホーム ディレクトリ情報の判定を行うためのプロバイダーを作成することもできます。

このチュートリアルでは、ネイティブ コードを使用して単純な FTP 認証プロバイダーを作成するステップを説明します。

必要条件

この記事の手順を完了するには、以下の項目が必須です。

  1. 1. Windows Server 2008 サーバーに IIS 7 がインストールされている必要があります。また、インターネット インフォメーション サービス (IIS) マネージャーもインストールされている必要があります。
  2. 新しい FTP 7.5 サービスがインストールされている必要があります。FTP 7.5 サービスは、Web サイト (https://www.iis.net/(英語)) からダウンロードしてインストールできます。次のいずれかのリンクを使用してください。
  3. FTP 発行用のルート フォルダーを作成する必要があります。
  4. Visual Studio 2008 を使用する必要があります。
    • メモ: Visual Studio の旧バージョンを使用すると、このチュートリアルのステップの一部が不正確になる可能性があります。
    • メモ: 64 ビット バージョン Windows 用のカスタム FTP プロバイダーを作成する場合は、Visual Studio 用の 64 ビット ツールおよびコンパイラーをインストールする必要があります。64 ビット開発についての追加情報は、Microsoft MSDN Web サイトのトピック「Visual Studio 64 ビット コンポーネントのインストール」に記載されています。

ステップ 1: プロジェクト環境のセットアップ

このステップでは、デモ プロバイダー用のプロジェクトを Visual Studio 2008 で作成します。

  1. Microsoft Visual Studio 2008 を開きます。
  2. [ファイル] メニューの [新規作成] をクリックし、[プロジェクト] をクリックします。
  3. [新しいプロジェクト] ダイアログ ボックスで以下の操作を行います。
    • プロジェクトの種類として [Visual C++] を選択します。
    • テンプレートとして [ATL プロジェクト] を選択します。
    • プロジェクト名として「FtpAuthenticationDemo」と入力します。
    • [OK] をクリックします。
  4. [ATL プロジェクト ウィザード] ダイアログ ボックスで以下の操作を行います。
    • [次へ] をクリックします。
    • [ダイナミック リンク ライブラリ (DLL)] のみがオンになっていることを確認します。
    • [完了] をクリックします。
  5. プロジェクトが開いたら、プロジェクトに ATL クラスを追加します。
    • [プロジェクト] メニューの [クラスの追加] をクリックします。
    • テンプレートとして [ATL シンプル オブジェクト] を選択します。
    • [追加] をクリックします。
  6. [ATL シンプル オブジェクト ウィザード] が表示されたら、以下の操作を行います。
    • 短い名前として「FtpAuthDemo」と入力し、他の値は既定値のままにします。
    • [次へ] をクリックします。
    • 以下のオプションを選択します。
      • [スレッド モデル] に [アパートメント] を選択します (メモ: これはアプリケーションのニーズに合わせてカスタマイズできます)。
      • [アグリゲーション] で [いいえ] を選択します (メモ: これはアプリケーションのニーズに合わせてカスタマイズできます)。
      • [インターフェイス] で [カスタム] を選択します。
    • [完了] をクリックします。
  7. 拡張機能インターフェイスを追加します。
    • [表示] メニューの [クラス ビュー] をクリックします。

    • [クラス ビュー] ウィンドウで、[FtpAuthenticationDemo] を展開します。

    • [CFtpAuthDemo] を右クリックし、[追加] をクリックしてから、[インターフェイスの実装] をクリックします。

    • インターフェイスの実装に [ファイル] を選択します。

    • [場所] には、FTP 拡張機能タイプ ライブラリのフル パスを入力します。次に例を示します。

      C:\Windows\System32\inetsrv\ftpext.tlb
      

      メモ: 64 ビット コンピューター上で開発している場合は、FTP 拡張機能タイプ ライブラリを次の 32 ビット パスにコピーして、その場所を使用する必要があります。次に例を示します。

      C:\Windows\SysWOW64\inetsrv\ftpext.tlb
      
    • 実装する以下のインターフェイスを選択します。

      • IFtpAuthenticationProvider
      • IFtpRoleProvider
    • [完了] をクリックします。

  8. DLL が自動的に登録されないようにプロジェクトを構成します。
    • [プロジェクト] メニューの [FtpAuthenticationDemo のプロパティ] をクリックします。
    • [構成プロパティ] を展開し、[リンカ] をクリックします。
    • [出力の登録] を選択し、ドロップダウン メニューの [いいえ] をクリックします。
    • [OK] をクリックします。
  9. オプション: Windows の 32 ビット バージョン上でカスタム プロバイダーを開発している場合は、カスタム ビルド イベントを追加して、開発コンピューターに DLL が自動的に展開され登録されるようにすることもできます(メモ: これらのステップは Windows の 64 ビット バージョンには適用できません)。カスタム ビルド イベントを追加するには、以下のステップに従います。
    • [プロジェクト] メニューの [FtpAuthenticationDemo のプロパティ] をクリックします。

    • [構成プロパティ] を展開し、さらに [ビルド イベント] を展開してから、[ビルド後のイベント] をクリックします。

    • [コマンド ライン] テキスト ボックスの右側にある省略記号 [...] をクリックします。

    • [コマンド ライン] ダイアログ ボックスに、次を入力します。

      net stop ftpsvc
      copy /y "$(TargetPath)" "%WINDIR%\System32\inetsrv"
      regsvr32.exe /s "%WINDIR%\System32\inetsrv\$(TargetFileName)"
      net start ftpsvc
      
    • [OK] をクリックして [コマンド ライン] ダイアログ ボックスを閉じます。

    • [OK] をクリックして [FtpAuthenticationDemo プロパティ ページ] ダイアログ ボックスを閉じます。

  10. 64 ビット バージョン Windows 用のプロバイダーを開発している場合は、64 ビット コンパイル用のビルド構成を追加する必要があります。
    • [ビルド] メニューの [構成マネージャ] をクリックします。
    • [アクティブ ソリューション プラットフォーム] ドロップダウン メニュー の [<新規作成>] をクリックします。
    • [新しいプラットフォームを入力または選択してください] ドロップダウン メニュー の [x64] をクリックします。
    • [OK] をクリックします。
    • [閉じる] をクリックします。
  11. プロジェクトを保存します。

ステップ 2: 拡張機能インターフェイスの実装

このステップでは、デモ プロバイダー用の拡張機能インターフェイスを実装します。

  1. IFtpAuthenticationProvider を実装します。

    • [クラス ビュー] ウィンドウで、[AuthenticateUser] メソッドをダブルクリックします。

    • 既存の実装を以下のコードで置き換えます。

      // IFtpAuthenticationProvider メソッドpublic:
      STDMETHOD(AuthenticateUser)(LPWSTR pszSessionId,
      LPWSTR pszSiteName,
      LPWSTR pszUserName,
      LPWSTR pszPassword,
      LPWSTR * ppszCanonicalUserName,
      long * pfAuthenticated)
      {
      // メモ: 独自のカスタム ロジックをここに追加できます。
      *ppszCanonicalUserName = pszUserName;
      CString strUserName = L"MyUser";
      CString strPassword = L"MyPassword";
      // ユーザー名とパスワードが有効であることを検証します。// この例では、ユーザー名の大文字と小文字は区別されず、// パスワードの大文字と小文字は区別されます。if ((strUserName.CompareNoCase(pszUserName)==0) &&
      
      (strPassword.Compare(pszPassword)==0))
      {
      *pfAuthenticated = TRUE;
      }
      else
      {
      *pfAuthenticated = FALSE;
      }
      return S_OK;
      }
      
  2. IFtpRoleProvider を実装します。

    • [クラス ビュー] ウィンドウで、[IsUserInRole] メソッドをダブルクリックします。

    • 既存の実装を以下のコードで置き換えます。

      // IFtpRoleProvider メソッドpublic:
      STDMETHOD(IsUserInRole)(LPWSTR pszSessionId,
      LPWSTR pszSiteName,
      LPWSTR pszUserName,
      LPWSTR pszRole,
      long * pfIsInRole)
      {
      // メモ: 独自のカスタム ロジックをここに追加できます。
      CString strUserName = L"MyUser";
      CString strRoleName = L"MyRole";
      // ユーザー名と役割名が有効であることを検証します。// この例では、ユーザー名と役割名の両方とも// 大文字と小文字は区別されません。if ((strUserName.CompareNoCase(pszUserName)==0) &&
      
      (strRoleName.CompareNoCase(pszRole)==0))
      {
      *pfIsInRole = TRUE;
      }
      else
      {
      *pfIsInRole = FALSE;
      }
      return S_OK;
      }
      
  3. FtpAuthDemo.h ファイルの先頭に、atlstr.h に対するインクルード ファイル参照を追加します。

    #include <atlstr.h>
    
  4. プロジェクトを保存してビルドします。

ステップ 3: FTP への認証プロバイダーの追加

このステップでは、デモ プロバイダーを FTP サービスおよび既定の Web サイトに追加します。

  1. FTP 認証プロバイダーのグローバル リストに拡張機能プロバイダーを追加します。
    • インターネット インフォメーション サービス (IIS) マネージャーを開きます。
    • [接続] ウィンドウで、コンピューターの名前をクリックします。
    • メイン ウィンドウで [FTP 認証] をダブルクリックします。
    • [操作] ウィンドウで、[カスタム プロバイダー] をクリックします。
    • [登録] をクリックします。
    • プロバイダーの [名前] に「FtpAuthenticationDemo」と入力します。
    • [ネイティブ プロバイダー (COM)] をクリックします。
    • 拡張機能プロバイダーのクラス名に「FtpAuthenticationDemo.FtpAuthDemo」と入力します。
    • [OK] をクリックします。
    • プロバイダーの一覧の [FtpAuthenticationDemo] チェック ボックスをオフにします。
    • [OK] をクリックします。
  2. FTP サイト用のカスタム認証プロバイダーを追加します。
    • インターネット インフォメーション サービス (IIS) マネージャーで FTP サイトを開きます。
    • メイン ウィンドウで [FTP 認証] をダブルクリックします。
    • [操作] ウィンドウで、[カスタム プロバイダー] をクリックします。
    • プロバイダーの一覧で [FtpAuthenticationDemo] をオンにします。
    • [OK] をクリックします。
  3. 認証プロバイダー用の承認規則を追加します。
    • メイン ウィンドウで [FTP 承認規則] をダブルクリックします。
    • [操作] ウィンドウで、[許可規則の追加] をクリックします。
    • 以下のどちらかの承認規則を追加できます。
      • 指定されたユーザー:
        • アクセスのオプションで [指定されたユーザー] を選択します。
        • ユーザー名として「MyUser」と入力します。
      • 役割またはグループ:
        • アクセスのオプションで [指定された役割またはユーザー グループ] を選択します。
        • 役割名として「MyRole」と入力します。
    • [アクセス許可] オプションで、[読み取り] および [書き込み] を選択します。
    • [OK] をクリックします。

まとめ

このチュートリアルでは、次について学びました。

  • カスタム FTP 認証プロバイダー用に Visual Studio 2008 でプロジェクトを作成する方法
  • カスタム FTP 認証用の拡張機能インターフェイスの実装方法
  • FTP サービスへのカスタム認証プロバイダーの追加方法

ユーザーが FTP サイトに接続したときに、FTP サービスはカスタム認証プロバイダーを使用してユーザーの認証を試行します。この認証に失敗すると、FTP サービスは他の組み込みプロバイダーまたは認証プロバイダーを使用してユーザーを認証します。

関連コンテンツ

記事