SQL Serverテーブルから認証するように設計されたカスタムIIS FTP認証プロバイダを構築しています。テーブルにはユーザー名、パスワード、ホームディレクトリがあり、これらはクエリから返されます。これらはすべてオーセンティケータでうまくいくようですが、ホームディレクトリプロバイダを実装しようとすると、私が指定したフォルダに入ることはありません。プロバイダが実際に呼び出されていないようです。同様に、アップロードされたファイルのカスタム処理を提供するためにポストプロセスを実装しようとすると、それは起動しません。私はすべてを正しく登録したか、認証方法が動かないと思ったので、私は困惑しています - なぜ他の2つは実行されていませんか?IIS FTP 8ホームディレクトリプロバイダが起動しない
テキストファイルに書き込んでいるので、メソッドが起動しているかどうかを判断できるようにコードを縮小しました。認証は機能し、他の認証は機能しません。
using System;
using System.IO;
using Microsoft.Web.FtpServer;
namespace MyCustomFtpExtension
{
public class DatabaseAuthenticator : BaseProvider,
IFtpAuthenticationProvider,
IFtpRoleProvider, IFtpHomeDirectoryProvider, IFtpPostprocessProvider,
IFtpLogProvider
{
private readonly string _logfile = Path.Combine(@"c:\test", "logs", "FtpExtension.log");
public bool AuthenticateUser(string sessionId, string siteName, string userName, string userPassword,
out string canonicalUserName)
{
canonicalUserName = userName;
var result = DatabaseHelper.Authenticate(userName, userPassword);
if (result)
{
LogMessage("Login Success: " + userName); //this message appears
}
else
{
LogMessage("Login Failure: " + userName);
}
return result;
}
string IFtpHomeDirectoryProvider.GetUserHomeDirectoryData(
string sessionId,
string siteName,
string userName)
{
LogMessage("In ftp home directory"); //this message never appears
return @"c:\temp\test";
}
public FtpProcessStatus HandlePostprocess(FtpPostprocessParameters postProcessParameters)
{
LogMessage("Running Post Process"); //this message never appears
return FtpProcessStatus.FtpProcessContinue;
}
public bool IsUserInRole(string sessionId, string siteName, string userName, string userRole)
{
return true; // I don't care about this - if they authenticate, that's all I need.
}
//to keep the sample short I took out the log provider - it was copy/paste from Microsoft's example
//this is a quick and dirty output so I can see what's going on (which isn't much)
private void LogMessage(string logEntry)
{
using (var sw = new StreamWriter(_logfile, true))
{
// Retrieve the current date and time for the log entry.
var dt = DateTime.Now;
sw.WriteLine("{0}\t{1}\tMESSAGE:{2}",
dt.ToShortDateString(),
dt.ToLongTimeString(),
logEntry);
sw.Flush();
}
}
}
}