我正在构建一个自定义IIS FTP身份验证器,用于从SQL Server表进行身份验证。该表具有用户名,密码和主目录,这些是从查询返回的。所有这些似乎在身份验证器中工作正常,但是当我尝试实现主目录提供程序时,我没有进入我指定的文件夹 - 似乎提供程序实际上并未被调用。同样,如果我尝试实现一个后期处理来提供上传文件的自定义处理,那么也不会触发。我很难过,因为我认为我已经正确地注册了所有内容,或者认证方法无法运行 - 那么为什么不执行其他两个呢?
我缩小了我的代码,所以我只是写一个文本文件,所以我可以判断该方法是否正在触发。身份验证有效,其他则无效。
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();
}
}
}
}
答案 0 :(得分:0)
我在IIS授权规则下的IIS管理器中找到了一个我没有注意到的设置。我不得不更改那里的设置以指示我的自定义组件。一旦我这样做了,所有方法都被触发了,我在文本文件中看到了所有消息,现在我又出现了另一个错误。所以回去研究我走了。但这就是他们没有解雇的原因。