2016-04-25 6 views
0

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(); 
      } 
     } 
    } 
} 

Antwort

0

Sie müssen Befehl ausführen, um Bibliothek fir Home-Verzeichnis-Provider zuweisen.

AppCmd set site "FTP Site Name" /+ftpServer.customFeatures.providers.[name='CustomFtpAuthDemo',enabled='true']