Ich habe einen benutzerdefinierten Authentifikator für IIS FTP 8 mit C# erstellt. Ich habe die benutzerdefinierte Funktion Handler richtig eingestellt, so dass IIS meine DLL verwendet, aber wenn ich versuche mich einzuloggen immer erhalten:IIS FTP 8 Benutzerdefinierte Authentifizierung Autorisierungsregeln verweigert den Zugriff
Response: 331 Password required
Command: PASS ********
Response: 530-User cannot log in, home directory inaccessible.
Response: Win32 error: No such interface supported
Response: Error details: Authorization rules denied the access.
Response: 530 End
Ich bin mir ziemlich sicher, ich habe Ordner-Berechtigungen ausgeschlossen - es so weit offen ist wie es sein kann. So wie ich die Nachricht verstehe - sie sagt mir, dass ich keine Autorisierungsregeln habe. Aber es scheint keinen Weg zu geben, einen für einen benutzerdefinierten Authentifikator hinzuzufügen. Die Benutzeroberfläche im IIS-Manager blendet die normalen Einstellungsfunktionen aus, sodass Sie keine hinzufügen können.
habe ich versucht, den App-cmd:
appcmd.exe set config "mysite" -section:system.ftpServer/security/authorization /+"[accessType='Allow',roles='administrators',permissions='Read, Write']" /commit:apphost
mit Variationen über die Rolle (Gast, *, etc.) ohne Erfolg.
Ich habe versucht, den Eintrag der Internet-Redaktion in applicationHost.config, aber ich kann keine Dokumentation über nicht finden, wo es andere zu setzen, als dieses „nicht-custom“ Beispiel von der Microsoft-Dokumentation:
<location path="ftp.example.com">
<system.ftpServer>
<security>
<authorization>
<add accessType="Allow" roles="administrators" permissions="Read, Write" />
</authorization>
Wenn Ich füge ein Authorization-Tag an der angegebenen Position in meiner Konfiguration, der FTP-Dienst wird nicht neu gestartet.
Wie zum Teufel fügen Sie eine Autorisierungsregel hinzu, wenn Sie einen benutzerdefinierten FTP-Authentifizierungsanbieter verwenden?
Der Vollständigkeit halber ist hier der Code für die Provider-Klasse. Beachten Sie die Ausgabe in der Textdatei in der LogMessage-Methode. Das zeigt mir, dass alles funktioniert - es kann einfach nicht zum Home-Ordner des Benutzers gelangen, weil es keine Autorisierungsregel dafür gibt.
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();
}
}
}
}