ネイティブ コード (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. Windows Server 2008 サーバーに IIS 7 がインストールされている必要があります。また、インターネット インフォメーション サービス (IIS) マネージャーもインストールされている必要があります。
- 新しい FTP 7.5 サービスがインストールされている必要があります。FTP 7.5 サービスは、Web サイト (https://www.iis.net/(英語)) からダウンロードしてインストールできます。次のいずれかのリンクを使用してください。
- FTP 発行用のルート フォルダーを作成する必要があります。
- Visual Studio 2008 を使用する必要があります。
- メモ: Visual Studio の旧バージョンを使用すると、このチュートリアルのステップの一部が不正確になる可能性があります。
- メモ: 64 ビット バージョン Windows 用のカスタム FTP プロバイダーを作成する場合は、Visual Studio 用の 64 ビット ツールおよびコンパイラーをインストールする必要があります。64 ビット開発についての追加情報は、Microsoft MSDN Web サイトのトピック「Visual Studio 64 ビット コンポーネントのインストール」に記載されています。
ステップ 1: プロジェクト環境のセットアップ
このステップでは、デモ プロバイダー用のプロジェクトを Visual Studio 2008 で作成します。
- Microsoft Visual Studio 2008 を開きます。
- [ファイル] メニューの [新規作成] をクリックし、[プロジェクト] をクリックします。
- [新しいプロジェクト] ダイアログ ボックスで以下の操作を行います。
- プロジェクトの種類として [Visual C++] を選択します。
- テンプレートとして [ATL プロジェクト] を選択します。
- プロジェクト名として「FtpAuthenticationDemo」と入力します。
- [OK] をクリックします。
- [ATL プロジェクト ウィザード] ダイアログ ボックスで以下の操作を行います。
- [次へ] をクリックします。
- [ダイナミック リンク ライブラリ (DLL)] のみがオンになっていることを確認します。
- [完了] をクリックします。
- プロジェクトが開いたら、プロジェクトに ATL クラスを追加します。
- [プロジェクト] メニューの [クラスの追加] をクリックします。
- テンプレートとして [ATL シンプル オブジェクト] を選択します。
- [追加] をクリックします。
- [ATL シンプル オブジェクト ウィザード] が表示されたら、以下の操作を行います。
- 短い名前として「FtpAuthDemo」と入力し、他の値は既定値のままにします。
- [次へ] をクリックします。
- 以下のオプションを選択します。
- [スレッド モデル] に [アパートメント] を選択します (メモ: これはアプリケーションのニーズに合わせてカスタマイズできます)。
- [アグリゲーション] で [いいえ] を選択します (メモ: これはアプリケーションのニーズに合わせてカスタマイズできます)。
- [インターフェイス] で [カスタム] を選択します。
- [完了] をクリックします。
- 拡張機能インターフェイスを追加します。
[表示] メニューの [クラス ビュー] をクリックします。
[クラス ビュー] ウィンドウで、[FtpAuthenticationDemo] を展開します。
[CFtpAuthDemo] を右クリックし、[追加] をクリックしてから、[インターフェイスの実装] をクリックします。
インターフェイスの実装に [ファイル] を選択します。
[場所] には、FTP 拡張機能タイプ ライブラリのフル パスを入力します。次に例を示します。
C:\Windows\System32\inetsrv\ftpext.tlb
メモ: 64 ビット コンピューター上で開発している場合は、FTP 拡張機能タイプ ライブラリを次の 32 ビット パスにコピーして、その場所を使用する必要があります。次に例を示します。
C:\Windows\SysWOW64\inetsrv\ftpext.tlb
実装する以下のインターフェイスを選択します。
- IFtpAuthenticationProvider
- IFtpRoleProvider
[完了] をクリックします。
- DLL が自動的に登録されないようにプロジェクトを構成します。
- [プロジェクト] メニューの [FtpAuthenticationDemo のプロパティ] をクリックします。
- [構成プロパティ] を展開し、[リンカ] をクリックします。
- [出力の登録] を選択し、ドロップダウン メニューの [いいえ] をクリックします。
- [OK] をクリックします。
- オプション: 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 プロパティ ページ] ダイアログ ボックスを閉じます。
- 64 ビット バージョン Windows 用のプロバイダーを開発している場合は、64 ビット コンパイル用のビルド構成を追加する必要があります。
- [ビルド] メニューの [構成マネージャ] をクリックします。
- [アクティブ ソリューション プラットフォーム] ドロップダウン メニュー の [<新規作成>] をクリックします。
- [新しいプラットフォームを入力または選択してください] ドロップダウン メニュー の [x64] をクリックします。
- [OK] をクリックします。
- [閉じる] をクリックします。
- プロジェクトを保存します。
ステップ 2: 拡張機能インターフェイスの実装
このステップでは、デモ プロバイダー用の拡張機能インターフェイスを実装します。
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; }
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; }
FtpAuthDemo.h ファイルの先頭に、atlstr.h に対するインクルード ファイル参照を追加します。
#include <atlstr.h>
プロジェクトを保存してビルドします。
ステップ 3: FTP への認証プロバイダーの追加
このステップでは、デモ プロバイダーを FTP サービスおよび既定の Web サイトに追加します。
- FTP 認証プロバイダーのグローバル リストに拡張機能プロバイダーを追加します。
- インターネット インフォメーション サービス (IIS) マネージャーを開きます。
- [接続] ウィンドウで、コンピューターの名前をクリックします。
- メイン ウィンドウで [FTP 認証] をダブルクリックします。
- [操作] ウィンドウで、[カスタム プロバイダー] をクリックします。
- [登録] をクリックします。
- プロバイダーの [名前] に「FtpAuthenticationDemo」と入力します。
- [ネイティブ プロバイダー (COM)] をクリックします。
- 拡張機能プロバイダーのクラス名に「FtpAuthenticationDemo.FtpAuthDemo」と入力します。
- [OK] をクリックします。
- プロバイダーの一覧の [FtpAuthenticationDemo] チェック ボックスをオフにします。
- [OK] をクリックします。
- FTP サイト用のカスタム認証プロバイダーを追加します。
- インターネット インフォメーション サービス (IIS) マネージャーで FTP サイトを開きます。
- メイン ウィンドウで [FTP 認証] をダブルクリックします。
- [操作] ウィンドウで、[カスタム プロバイダー] をクリックします。
- プロバイダーの一覧で [FtpAuthenticationDemo] をオンにします。
- [OK] をクリックします。
- 認証プロバイダー用の承認規則を追加します。
- メイン ウィンドウで [FTP 承認規則] をダブルクリックします。
- [操作] ウィンドウで、[許可規則の追加] をクリックします。
- 以下のどちらかの承認規則を追加できます。
- 指定されたユーザー:
- アクセスのオプションで [指定されたユーザー] を選択します。
- ユーザー名として「MyUser」と入力します。
- 役割またはグループ:
- アクセスのオプションで [指定された役割またはユーザー グループ] を選択します。
- 役割名として「MyRole」と入力します。
- 指定されたユーザー:
- [アクセス許可] オプションで、[読み取り] および [書き込み] を選択します。
- [OK] をクリックします。
まとめ
このチュートリアルでは、次について学びました。
- カスタム FTP 認証プロバイダー用に Visual Studio 2008 でプロジェクトを作成する方法
- カスタム FTP 認証用の拡張機能インターフェイスの実装方法
- FTP サービスへのカスタム認証プロバイダーの追加方法
ユーザーが FTP サイトに接続したときに、FTP サービスはカスタム認証プロバイダーを使用してユーザーの認証を試行します。この認証に失敗すると、FTP サービスは他の組み込みプロバイダーまたは認証プロバイダーを使用してユーザーを認証します。