次の方法で共有


FTP カスタム認証 <customAuthentication>

概要

<customAuthentication> 要素は、FTP サイトのカスタム認証の設定を指定します。 この形式の認証は、カスタム認証プロバイダーを使用してユーザー名とパスワードを検証します。

カスタム認証プロバイダーが FTP サイトに追加されると、FTP サービスは、FTP 構成設定にプロバイダーが指定されている順序で、有効になっている各カスタム認証プロバイダーでのユーザーの認証を試みます。 カスタム認証プロバイダーを使用してユーザーを認証できない場合、FTP サービスはユーザーの認証に基本認証 (有効な場合) を試みます。

カスタム認証プロバイダーを使用する主な利点は、ユーザー アカウントをご使用のサーバーやドメインに作成する必要がないことです。 これで、ネットワークのセキュリティが向上します。

Note

FTP 7.0 と FTP 7.5 には、次の 2 つのカスタム認証プロバイダーが付属しています。

  • ASP.NET メンバーシップ認証: これは、ASP.NET メンバーシップ データベースを使用して、ユーザー名とパスワードを検証します。 詳細については、Microsoft の IIS.net Web サイトの「.NET メンバーシップ認証を使用した FTP の構成」トピックを参照してください。
  • IIS マネージャー認証: これは、IIS 管理ユーザー ストアを使用して、ユーザー名とパスワードを検証します。 詳細については、Microsoft の IIS.net Web サイトの IIS 7.0 マネージャー認証を使用して FTP を構成する方法に関するトピックを参照してください。

Note

<customAuthentication/providers> 要素に追加されるカスタム認証プロバイダーは、<system.ftpServer/providerDefinitions> コレクションに登録する必要があります。

Note

カスタム認証プロバイダーの作成のサポートは、FTP 7.5 で導入されました。 カスタム認証プロバイダーを作成する方法の詳細については、Microsoft の www.iis.net/learn Web サイトの FTP 7.5 向けの開発に関するセクションを参照してください。

互換性

バージョン メモ
IIS 10.0 <customAuthentication> 要素は IIS 10.0 では変更されませんでした。
IIS 8.5 <customAuthentication> 要素は IIS 8.5 では変更されませんでした。
IIS 8.0 <customAuthentication> 要素は IIS 8.0 では変更されませんでした。
IIS 7.5 <authentication> 要素の <customAuthentication> 要素は、IIS 7.5 の機能として付属しています。
IIS 7.0 <authentication> 要素の <customAuthentication> 要素が、IIS 7.0 用の別個のダウンロードとして FTP 7.0 で導入されました。
IIS 6.0 <ftpServer> 要素とその子要素は、LM/MSFTPSVC メタベース パスにある IIS 6.0 の FTP 設定を置き換えます。

Note

FTP 7.0 サービスと FTP 7.5 サービスは IIS 7.0 とは別に出荷され、次の URL からモジュールをダウンロードしてインストールする必要がありました。

https://www.iis.net/expand/FTP

Windows 7 と Windows Server 2008 R2 では、FTP 7.5 サービスは IIS 7.5 の機能として付属しているため、FTP サービスのダウンロードは必要なくなりました。

段取り

Web サーバーの FTP 公開をサポートするには、FTP サービスをインストールする必要があります。 そのためには、次のステップに従います。

Windows Server 2012 または Windows Server 2012 R2

  1. タスク バーで [サーバー マネージャー]をクリックします。

  2. [サーバー マネージャー] で、[管理] メニューを選択し、[役割と機能の追加] を選択します。

  3. [役割と機能の追加] ウィザードで、[次へ] をクリックします。 インストールの種類を選択し、[次へ] をクリックします。 対象サーバーを選択し、[次へ] をクリックします。

  4. [サーバーの役割] ページで、[Web サーバー (IIS)] を展開して、[FTP サーバー] を選びます。

    Note

    FTP サービスに対して ASP.NET メンバーシップ認証または IIS マネージャー認証をサポートするには、[FTP Service] に加えて[FTP 拡張] も選択する必要があります。
    強調表示され、選択されている F T P 機能拡張オプションのスクリーンショット。 .

  5. [次へ] をクリックし、[機能の選択] ページで再度 [次へ] をクリックします。

  6. [インストール オプションの確認] ページで、[インストール] をクリックします。

  7. [結果] ページで、 [閉じる]をクリックします。

Windows 8 または Windows 8.1

  1. [スタート] 画面で、ポインターを左下隅まで移動し、[スタート] ボタンを右クリックし、[コントロール パネル] をクリックします。

  2. [コントロール パネル][プログラムと機能] をクリックし、[Windows の機能の有効化または無効化] をクリックします。

  3. [インターネット インフォメーション サービス] を展開し、[FTP サーバー] を展開します。

    Note

    FTP サービスに対して ASP.NET メンバーシップ認証または IIS マネージャー認証をサポートするには、[FTP 拡張] も選択する必要があります。
    強調表示され選択されている F T P 機能拡張フォルダーのスクリーンショット。

  4. OK をクリックします。

  5. 閉じるをクリックします。

Windows Server 2008 R2

  1. タスク バーで [スタート] をクリックし、[管理ツール] をポイントして、[サーバー マネージャ] をクリックします。

  2. [サーバー マネージャ] 階層ウィンドウで [役割] を展開し、[Web サーバー (IIS)] をクリックします。

  3. [Web サーバー (IIS)] ウィンドウで、[役割サービス] セクションまでスクロールし、[役割サービスの追加] をクリックします。

  4. [役割サービスの追加] ウィザード[役割サービスの選択] ページで [FTP サーバー] を展開します。

  5. [FTP Service] を選択します。

    Note

    FTP サービスに対して ASP.NET メンバーシップ認証または IIS マネージャー認証をサポートするには、[FTP 拡張] も選択する必要があります。
    強調表示された [F T P サービス] オプションを示す [役割サービスの選択] ウィザードのスクリーンショット。

  6. 次へ をクリックします。

  7. [インストール オプションの確認] ページで、[インストール] をクリックします。

  8. [結果] ページで、 [閉じる]をクリックします。

Windows 7

  1. タスク バーで、[スタート][コントロール パネル] の順にクリックします。

  2. [コントロール パネル][プログラムと機能] をクリックし、[Windows の機能の有効化または無効化] をクリックします。

  3. [インターネット インフォメーション サービス][FTP サーバー] の順に展開します。

  4. [FTP Service] を選択します。

    Note

    FTP サービスに対して ASP.NET メンバーシップ認証または IIS マネージャー認証をサポートするには、[FTP 拡張] も選択する必要があります。
    インターネット インフォメーション サービス フォルダーとそのサブ フォルダーのスクリーンショット。

  5. OK をクリックします。

Windows Server 2008 または Windows Vista

  1. 次の URL からインストール パッケージをダウンロードします。

  2. 次のチュートリアルの手順に従って、FTP サービスをインストールします。

操作方法

FTP サイトに対して IIS マネージャー認証を有効にする方法

  1. 次のようにインターネット インフォメーション サービス (IIS) マネージャーを開きます。

    • Windows Server 2012 または Windows Server 2012 R2 を使用している場合:

      • タスク バーで、[サーバー マネージャー] をクリックし、[ツール][インターネット インフォメーション サービス (IIS) マネージャー] の順にクリックします。
    • Windows 8 または Windows 8.1 を使用している場合:

      • Windows キーを押しながら文字 X を押し、[コントロール パネル] をクリックします。
      • [管理ツール] をクリックし、[インターネット インフォメーション サービス (IIS) マネージャー] をダブルクリックします。
    • Windows Server 2008 または Windows Server 2008 R2 を使用している場合:

      • タスク バーで、[スタート] ボタンをクリックし、[管理ツール][インターネット インフォメーション サービス (IIS) マネージャー] の順にクリックします。
    • Windows Vista または Windows 7 を使用している場合:

      • タスク バーで、[スタート][コントロール パネル] の順にクリックします。
      • [管理ツール] をダブルクリックし、[インターネット インフォメーション サービス (IIS) マネージャー] をダブルクリックします。
  2. [接続] ウィンドウでサーバー名を展開し、[サイト] ノードを展開してから、サイトの名前をクリックします。

  3. サイトの [ホーム] ウィンドウで、[FTP 認証] 機能をダブルクリックします。

  4. [FTP 認証] ページが表示されたら、[操作] ウィンドウで [カスタム プロバイダー] をクリックします。
    [操作] ウィンドウの [カスタム プロバイダー] オプションを示す [F T P 認証] ページのスクリーンショット。

  5. [カスタム プロバイダー] ダイアログ ボックスが表示されたら、[IisManagerAuth] をクリックして選びます。 OK をクリックします。
    [I I S Manager 認証] オプションを示す [カスタム プロバイダー] ダイアログ ボックスのスクリーンショット。

  6. [FTP 認証] ページに、[IisManagerAuth] が有効になったことが示されます。
    [I I S Manager 認証] オプションが有効になっていることを示す [F T P 認証] ページのスクリーンショット。

  7. 必要に応じて、[基本認証] または [匿名認証] のいずれかのモードを強調表示し、[操作] ウィンドウで [無効にする] をクリックして、無効にできます。

FTP に対して IIS マネージャー認証を構成する方法の詳細については、Microsoft の www.iis.net/learn Web サイトの IIS 7.0 マネージャー認証を使用して FTP を構成する方法に関するトピックを参照してください。


FTP サイトに対してマネージド コード カスタム認証プロバイダーを追加する方法

Note

これらの手順は、カスタム FTP 認証プロバイダーが既にインストールされ、サーバーのグローバル アセンブリ キャッシュ (GAC) に登録されていることを前提としています。マネージド アセンブリを登録する方法の詳細については、Microsoft MSDN Web サイトの「グローバル アセンブリ キャッシュ ツール (Gacutil.exe)」トピックを参照してください。

  1. 次のように、拡張プロバイダーのアセンブリ情報を確認します。

    • Windows エクスプローラーで、"C:\Windows\assembly" パスを開きます。ここで、C: はオペレーティング システム ドライブです。
    • アセンブリを見つけます。 たとえば、FtpAuthenticationDemo です。
    • アセンブリを右クリックし、[プロパティ] をクリックします。
    • カルチャ値をコピーします。 たとえば、Neutral です。
    • バージョン番号をコピーします。 たとえば、1.0.0.0 です。
    • 公開キー トークン値をコピーします。 たとえば、426f62526f636b73 です。
    • [キャンセル] をクリックします。
  2. 次のように、拡張プロバイダーを FTP 認証プロバイダーのグローバル リストに追加します。

    • [インターネット インフォメーション サービス (IIS) マネージャー] を開きます。
    • [接続] ウィンドウのコンピューター名をクリックします。
    • メイン ウィンドウで [FTP Authentication] をダブルクリックします。
      F T P 認証のメイン ウィンドウのスクリーンショット。
    • [操作] ウィンドウで [Custom Providers...] (カスタム プロバイダー...) を選択します。
    • [登録] をクリックします。
      [登録] オプションを示す [カスタム プロバイダー] ダイアログ ボックスのスクリーンショット。
    • [名前] ボックスに、カスタム認証プロバイダーのフレンドリ名を入力します。 たとえば、FtpAuthenticationDemo です。
    • [マネージド プロバイダー (.NET)] を選択します。
      [カスタム認証プロバイダーの追加] ダイアログ ボックスのスクリーンショット。マネージド プロバイダードット NET オプションが選択されています。
    • 前にコピーした情報を使用して、拡張プロバイダーのアセンブリ情報を入力します。 次に例を示します。
      FtpAuthentication.FtpAuthDemo, FtpAuthenticationDemo, version=1.0.0.0, Culture=neutral, PublicKeyToken=426f62526f636b73
    • OK をクリックします。
    • プロバイダーの一覧でカスタム認証プロバイダーのチェック ボックスをオフにします。
    • OK をクリックします。
  3. 次のように、FTP サイトに対してカスタム認証プロバイダーを追加します。

    • インターネット インフォメーション サービス (IIS) マネージャーで FTP サイトを開きます。
    • メイン ウィンドウで [FTP 認証] をダブルクリックします。
    • [操作] ウィンドウで [カスタム プロバイダー] をクリックします。
    • プロバイダーの一覧でカスタム認証プロバイダーをオンにして選択し、有効にします。
    • OK をクリックします。

構成

<customAuthentication> 要素は、サイト レベルで構成されます。

属性

なし。

子要素

要素 説明
providers 省略可能な要素です。

カスタム認証プロバイダーのコレクションを指定します。

構成サンプル

次のサンプルは、FtpAuthenticationDemo という名前のカスタム認証プロバイダーを有効にし、組み込みの認証プロバイダーを無効にする、<customAuthentication> 要素を持つ FTP サイトを示しています。

<site name="ftp.example.com" id="5">
   <application path="/">
      <virtualDirectory path="/" physicalPath="c:\inetpub\www.example.com" />
   </application>
   <bindings>
      <binding protocol="ftp" bindingInformation="*:21:" />
   </bindings>
   <ftpServer serverAutoStart="true">
      <security>
         <authentication>
            <basicAuthentication enabled="false" />
            <anonymousAuthentication enabled="false" />
            <customAuthentication>
               <providers>
                  <add name="FtpAuthenticationDemo" enabled="true" />
               </providers>
            </customAuthentication>
         </authentication>
         <ssl controlChannelPolicy="SslAllow" dataChannelPolicy="SslAllow" />
      </security>
   </ftpServer>
</site>

サンプル コード

次の例は、カスタム認証プロバイダーを FTP サイトに追加して有効にします。

AppCmd.exe

appcmd.exe set config -section:system.applicationHost/sites /+"[name='ftp.example.com'].ftpServer.security.authentication.customAuthentication.providers.[name='FtpXmlAuthentication',enabled='True']" /commit:apphost

Note

AppCmd.exe を使用してこれらの設定を構成するときは、commit パラメーターを必ず apphost に設定する必要があります。 これで、ApplicationHost.config ファイルの適切な場所セクションに構成設定がコミットされます。

C#

using System;
using System.Text;
using Microsoft.Web.Administration;

internal static class Sample
{
   private static void Main()
   {
      using (ServerManager serverManager = new ServerManager())
      {
         Configuration config = serverManager.GetApplicationHostConfiguration();
         ConfigurationSection sitesSection = config.GetSection("system.applicationHost/sites");
         ConfigurationElementCollection sitesCollection = sitesSection.GetCollection();
         ConfigurationElement siteElement = FindElement(sitesCollection, "site", "name", @"ftp.example.com");

         if (siteElement == null) throw new InvalidOperationException("Element not found!");

         ConfigurationElement ftpServerElement = siteElement.GetChildElement("ftpServer");
         ConfigurationElement securityElement = ftpServerElement.GetChildElement("security");
         ConfigurationElement authenticationElement = securityElement.GetChildElement("authentication");
         ConfigurationElement customAuthenticationElement = authenticationElement.GetChildElement("customAuthentication");
         ConfigurationElementCollection providersCollection = customAuthenticationElement.GetCollection("providers");

         ConfigurationElement addElement = providersCollection.CreateElement("add");
         addElement["name"] = @"FtpXmlAuthentication";
         addElement["enabled"] = true;
         providersCollection.Add(addElement);

         serverManager.CommitChanges();
      }
   }

   private static ConfigurationElement FindElement(ConfigurationElementCollection collection, string elementTagName, params string[] keyValues)
   {
      foreach (ConfigurationElement element in collection)
      {
         if (String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase))
         {
            bool matches = true;
            for (int i = 0; i < keyValues.Length; i += 2)
            {
               object o = element.GetAttributeValue(keyValues[i]);
               string value = null;
               if (o != null)
               {
                  value = o.ToString();
               }
               if (!String.Equals(value, keyValues[i + 1], StringComparison.OrdinalIgnoreCase))
               {
                  matches = false;
                  break;
               }
            }
            if (matches)
            {
               return element;
            }
         }
      }
      return null;
   }
}

VB.NET

Imports System
Imports System.Text
Imports Microsoft.Web.Administration

Module Sample
   Sub Main()
      Dim serverManager As ServerManager = New ServerManager
      Dim config As Configuration = serverManager.GetApplicationHostConfiguration
      Dim sitesSection As ConfigurationSection = config.GetSection("system.applicationHost/sites")
      Dim sitesCollection As ConfigurationElementCollection = sitesSection.GetCollection
      Dim siteElement As ConfigurationElement = FindElement(sitesCollection, "site", "name", "ftp.example.com")

      If (siteElement Is Nothing) Then
         Throw New InvalidOperationException("Element not found!")
      End If

      Dim ftpServerElement As ConfigurationElement = siteElement.GetChildElement("ftpServer")
      Dim securityElement As ConfigurationElement = ftpServerElement.GetChildElement("security")
      Dim authenticationElement As ConfigurationElement = securityElement.GetChildElement("authentication")
      Dim customAuthenticationElement As ConfigurationElement = authenticationElement.GetChildElement("customAuthentication")
      Dim providersCollection As ConfigurationElementCollection = customAuthenticationElement.GetCollection("providers")
      Dim addElement As ConfigurationElement = providersCollection.CreateElement("add")
      addElement("name") = "FtpXmlAuthentication"
      addElement("enabled") = True
      providersCollection.Add(addElement)

      serverManager.CommitChanges()
   End Sub

   Private Function FindElement(ByVal collection As ConfigurationElementCollection, ByVal elementTagName As String, ByVal ParamArray keyValues() As String) As ConfigurationElement
      For Each element As ConfigurationElement In collection
         If String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase) Then
            Dim matches As Boolean = True
            Dim i As Integer
            For i = 0 To keyValues.Length - 1 Step 2
               Dim o As Object = element.GetAttributeValue(keyValues(i))
               Dim value As String = Nothing
               If (Not (o) Is Nothing) Then
                  value = o.ToString
               End If
               If Not String.Equals(value, keyValues((i + 1)), StringComparison.OrdinalIgnoreCase) Then
                  matches = False
                  Exit For
               End If
            Next
            If matches Then
               Return element
            End If
         End If
      Next
      Return Nothing
   End Function


End Module

JavaScript

var adminManager = new ActiveXObject('Microsoft.ApplicationHost.WritableAdminManager');
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST";
var sitesSection = adminManager.GetAdminSection("system.applicationHost/sites", "MACHINE/WEBROOT/APPHOST");
var sitesCollection = sitesSection.Collection;

var siteElementPos = FindElement(sitesCollection, "site", ["name", "ftp.example.com"]);
if (siteElementPos == -1) throw "Element not found!";
var siteElement = sitesCollection.Item(siteElementPos);

var ftpServerElement = siteElement.ChildElements.Item("ftpServer");
var securityElement = ftpServerElement.ChildElements.Item("security");
var authenticationElement = securityElement.ChildElements.Item("authentication");
var customAuthenticationElement = authenticationElement.ChildElements.Item("customAuthentication");
var providersCollection = customAuthenticationElement.ChildElements.Item("providers").Collection;

var addElement = providersCollection.CreateNewElement("add");
addElement.Properties.Item("name").Value = "FtpXmlAuthentication";
addElement.Properties.Item("enabled").Value = true;
providersCollection.AddElement(addElement);

adminManager.CommitChanges();

function FindElement(collection, elementTagName, valuesToMatch) {
   for (var i = 0; i < collection.Count; i++) {
      var element = collection.Item(i);
      if (element.Name == elementTagName) {
         var matches = true;
         for (var iVal = 0; iVal < valuesToMatch.length; iVal += 2) {
            var property = element.GetPropertyByName(valuesToMatch[iVal]);
            var value = property.Value;
            if (value != null) {
               value = value.toString();
            }
            if (value != valuesToMatch[iVal + 1]) {
               matches = false;
               break;
            }
         }
         if (matches) {
            return i;
         }
      }
   }
   return -1;
}

VBScript

Set adminManager = createObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST"
Set sitesSection = adminManager.GetAdminSection("system.applicationHost/sites", "MACHINE/WEBROOT/APPHOST")
Set sitesCollection = sitesSection.Collection

siteElementPos = FindElement(sitesCollection, "site", Array("name", "ftp.example.com"))
If siteElementPos = -1 Then
WScript.Echo "Element not found!"
WScript.Quit
End If

Set siteElement = sitesCollection.Item(siteElementPos)
Set ftpServerElement = siteElement.ChildElements.Item("ftpServer")
Set securityElement = ftpServerElement.ChildElements.Item("security")
Set authenticationElement = securityElement.ChildElements.Item("authentication")
Set customAuthenticationElement = authenticationElement.ChildElements.Item("customAuthentication")
Set providersCollection = customAuthenticationElement.ChildElements.Item("providers").Collection

Set addElement = providersCollection.CreateNewElement("add")
addElement.Properties.Item("name").Value = "FtpXmlAuthentication"
addElement.Properties.Item("enabled").Value = True
providersCollection.AddElement(addElement)

adminManager.CommitChanges()

Function FindElement(collection, elementTagName, valuesToMatch)
   For i = 0 To CInt(collection.Count) - 1
      Set element = collection.Item(i)
      If element.Name = elementTagName Then
         matches = True
         For iVal = 0 To UBound(valuesToMatch) Step 2
            Set property = element.GetPropertyByName(valuesToMatch(iVal))
            value = property.Value
            If Not IsNull(value) Then
               value = CStr(value)
            End If
            If Not value = CStr(valuesToMatch(iVal + 1)) Then
               matches = False
               Exit For
            End If
         Next
         If matches Then
            Exit For
         End If
      End If
   Next
   If matches Then
      FindElement = i
   Else
      FindElement = -1
   End If
End Function