@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
参考:   http://gzzhang.blog.51cto.com/5312382/1125092

随着IIS7的发布,IIS自带的FTP终于能自定义验证了.

目前知道的自定义接口共三个  自定义校验, 自定义主目录,自定义日志

分别是 Microsoft.Web.FtpServer的

IFtpAuthenticationProvider,
        IFtpRoleProvider       主目录: IFtpHomeDirectoryProvider  日志的没测试, 可以在WWW.IIS.NET直接找到的

步骤:

1.  首先创建 C#类库 (要选择 2.0  / 3.5 框架) ,有说 .NET 4.0不支持 ,但是这个没做验证,需要后期继续测试

2.  然后增加生成事件  后期处理  VS2012版本:

net stop ftpsvc
call "%VS110COMNTOOLS%\vsvars32.bat">null
gacutil.exe /if "$(TargetPath)"
net start ftpsvc   VS2013 =vs120 ,其他版本递减

3. 添加签名(无密码)

4. 代码

namespace FtpHomeDirectory

{

    public class FtpHomeDirDemo : BaseProvider,

        IFtpHomeDirectoryProvider

    {

        string IFtpHomeDirectoryProvider.GetUserHomeDirectoryData(

            string sessionId,

            string siteName,

            string userName)

        {

            // Note: You would add your own custom logic here.

            // Return the user's home directory based on their user name.

            string homedir = @"D:\Ftptest\" + userName;

            VASLog.WriteLog_day(@"d:\Ftptest", "ftplog", "siteName: " + siteName + "   用户想要得到的目录是:"+homedir+" ;");

            return homedir;

        }

    }

}

密码验证

namespace FtpAuthenticationDemo

{

    public class FtpAuthDemo : BaseProvider,

        IFtpAuthenticationProvider,

        IFtpRoleProvider  

    {

        //void IFtpLogProvider.Log(FtpLogEntry loggingParameters)

        //{

        //    // Note: You would add your own custom logic here.

        //    // Open the log file for output.

        //    using (StreamWriter sw =

        //        new StreamWriter(@"C:\inetpub\logs\LogFiles\FTPSVC8\myftplog.log", true))

        //    {

        //        // Retrieve the current date and time for the log entry.

        //        DateTime dt = DateTime.Now;

        //        // Retrieve the user name.

        //        string un = loggingParameters.UserName;

        //        // Write the log entry to the log file.

        //        sw.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}\t{5}",

        //            dt.ToShortDateString(),

        //            dt.ToLongTimeString(),

        //            loggingParameters.RemoteIPAddress,

        //            (un.Length == 0) ? "-" : un,

        //            loggingParameters.Command,

        //            loggingParameters.SessionId);

        //    }

        //}

        bool IFtpAuthenticationProvider.AuthenticateUser(

            string sessionId,

            string siteName,

            string userName,

            string userPassword,

            out string canonicalUserName)

        {

            // Note: You would add your own custom logic here.

            canonicalUserName = userName;

            //string strUserName = "test";

            //string strPassword = "123";

            VASLog.WriteLog_day(@"d:\Ftptest", "ftplog", canonicalUserName + "   siteName: " +siteName +"   校验总是可以成功的;");

            return true;

            // Verify that the user name and password are valid.

            // Note: In this example, the user name is case-insensitive

            // and the password is case-sensitive.

            //if (((userName.Equals(strUserName,

            //    StringComparison.OrdinalIgnoreCase)) == true) &&

            //    userPassword == strPassword)

            //{

            //    return true;

            //}

            //else

            //{

            //    return true;

            //}

        }

        bool IFtpRoleProvider.IsUserInRole(

            string sessionId,

            string siteName,

            string userName,

            string userRole)

        {

            // Note: You would add your own custom logic here.

            string strUserName = "MyUser";

            string strRoleName = "MyRole";

            //VASLog.WriteLog_day(@"d:\Ftptest", "ftplog", "IsUserInRole");

            return true;

            // Verify that the user name and role name are valid.

            // Note: In this example, both the user name and

            // the role name are case-insensitive.

            if (((userName.Equals(strUserName,

                StringComparison.OrdinalIgnoreCase)) == true) &&

                ((userRole.Equals(strRoleName,

                StringComparison.OrdinalIgnoreCase)) == true))

            {

                return true;

            }

            else

            {

                return false;

            }

        }

        //string IFtpHomeDirectoryProvider.GetUserHomeDirectoryData(

        //        string sessionId,

        //        string siteName,

        //        string userName)

        //{

        //    VASLog.WriteLog_day(@"d:\Ftptest", "ftplog", "GetUserHomeDirectoryData");

        //    // Note: You would add your own custom logic here.

        //    // Return the user's home directory based on their user name.

        //    return @"d:\FtpTest\" + userName;

        //}

    }

}

尽量两个分开吧

生成后,在输出里可以看到

1>  
1>  Microsoft (R) .NET Global Assembly Cache Utility.  Version 4.0.30319.17929
1>  版权所有(C) Microsoft Corporation。保留所有权利。
1>  
1>  程序集已成功添加到缓存中
1>  Microsoft FTP Service 服务正在启动 .
1>  Microsoft FTP Service 服务已经启动成功。

然后要做的,就是配置IIS了

1. 在IIS的根基目录中,配置 FTP身份验证,禁用其他选项,在右侧自定义提供程序中,注册刚才的DLL,

http://www.iis.net/learn/develop/developing-for-ftp/how-to-use-managed-code-c-to-create-a-simple-ftp-authentication-provider

2. FTP规则里,允许所有账户

3. 同样的注册主目录DLL

4. 跟密码验证不同,主目录的DLL,还需要设置两个地方

http://www.iis.net/learn/develop/developing-for-ftp/how-to-use-managed-code-c-to-create-a-simple-ftp-home-directory-provider

cd  %systemroot%/system32/Inetsrv/

AppCmd set site "YourFTP" /+ftpServer.customFeatures.providers.[name='FtpHomeDirectoryDemo',enabled='true']
AppCmd set site "YourFTP" /ftpServer.userIsolation.mode:Custom

注意:  第一个appcmd 里面的 name = ftphomedirectorydemo 这个name,是在上面注册在IIS里的名称,跟DLL的空间类名没关系,一定要注意

禁用缓存,以管理员身份运行:
cd /d "%SystemRoot%\System32\Inetsrv"
Appcmd.exe set config -section:system.ftpServer/caching /credentialsCache.enabled:"False" /commit:apphost

这个一定要执行,不然,修改了数据库的密码之后,依然旧密码要保留一点时间,但是原因是什么,不理解.

现象,好像是登录时,直接就过了验证,进入到了目录获取的地方去了.

这样设置之后,才能启用主目录的设置

5. 在FTP用户隔离里,选择 下面的 用户名目录(禁用全局虚拟目录) ,这个用不用,还不知道,有待测试! 原理上考虑,这个其实没作用了,毕竟主目录在DLL里,已经可以定义了

这里应该在FTP用户隔离 属性设置中,改成自定义(简单测试了下,好像是这样)

这里有个好玩的,如果继续设置LocalUser虚拟目录(物理目录也可以的),指向了同名FTP用户名的文件夹下面,

这时候设置IP限制之类的,也是生效的,这样子,可以针对单独的FTP做限制了。

FTP 7.5 自定义扩展功能的更多相关文章

  1. Java 自定义FTP连接池

    转自:https://blog.csdn.net/eakom/article/details/79038590 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn ...

  2. 虚拟机中使用centos7搭建ftp服务器

    应用场景 本地windows作为客户端,虚拟机CentOS7作为服务器端,搭建FTP服务器,本地访问虚拟机实现文件的上传下载.如何在虚拟机安装centos7就不在赘述. 1.在centos7上安装vs ...

  3. FTP和TCP的文件传输效率对比测试分析

    前言 最近因项目需要,需要把一定数量的中等文件从开发板上传到电脑上,分别选择了FTP和TCP自定义协议两种方式进行传输,进行了简单的对比测试,故做如下记录. 测试环境 开发板:Linux,ARMv7 ...

  4. 一文看懂web服务器、应用服务器、web容器、反向代理服务器区别与联系

    我们知道,不同肤色的人外貌差别很大,而双胞胎的辨识很难.有意思的是Web服务器/Web容器/Web应用程序服务器/反向代理有点像四胞胎,在网络上经常一起出现.本文将带读者对这四个相似概念如何区分. 1 ...

  5. Web服务器、应用服务器、Web容器、反向代理服务器区别与联系

    作者: 帅虫哥 出处:www.cnblogs.com/vipyoumay/p/7455431.html(点击尾部阅读原文前往) 我们知道,不同肤色的人外貌差别很大,而双胞胎的辨识很难.有意思的是Web ...

  6. [转帖]一文看懂web服务器、应用服务器、web容器、反向代理服务器区别与联系

    一文看懂web服务器.应用服务器.web容器.反向代理服务器区别与联系 https://www.cnblogs.com/vipyoumay/p/7455431.html 我们知道,不同肤色的人外貌差别 ...

  7. Membership三步曲之入门篇 - Membership基础示例

    Membership 三步曲之入门篇 - Membership基础示例 Membership三步曲之入门篇 -  Membership基础示例 Membership三步曲之进阶篇 -  深入剖析Pro ...

  8. Android Weekly Notes Issue #232

    Android Weekly Issue #232 November 20th, 2016 Android Weekly Issue #232 本期内容包括: Kotlin的优势讨论; MVVM模式结 ...

  9. 开源免费的HTML5游戏引擎

    青瓷引擎的成长 青瓷引擎自2015年4月项目启动开始,7月首次亮相2015年ChinaJoy,便得到业界的极大关注,随后开启限量测试,收到数百个开发者团队的试用申请及反馈,期间经历了18个内测版本,完 ...

随机推荐

  1. A - LCM Challenge

    A - LCM Challenge Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others ...

  2. 对方网络ping不通

    后台接口往往部署在其他服务器上如果ping不同 很大可能是因为对方开防火墙的原因 解决方法:控制面板-windows防火墙-打开或关闭windows防火墙

  3. Yii2.0 多条件搜索 带分页

                                   方法一   在控制器中 ; if($titles!=""){ $where.=" and title lik ...

  4. 十二、oracle 数据库(表)的逻辑备份与恢复

    一.介绍逻辑备份是指使用工具export将数据对象的结构和数据导出到文件的过程.逻辑恢复是指当数据库对象被误操作而损坏后使用工具import利用备份的文件把数据对象导入到数据库的过程.物理备份即可在数 ...

  5. jquery效果,多个div,点击任何一个div,那么这个div会切换文字,变换背景颜色,再次点击其他的div ,这个div会发生刚才的变化,之前点击的div的颜色会变回来

    首先css样式: /*原来的背景色*/ .bg { background:'red' } /*需要切换的背景色*/ .bg_click { background:'green' } JS: $('di ...

  6. js中call方法的使用介绍

    js call call 方法 请参阅 应用于:Function 对象 要求 版本 5.5 调用一个对象的一个方法,以另一个对象替换当前对象. call([thisObj[,arg1[, arg2[, ...

  7. StartSSL证书申请

    StartSSL官方地址: http://www.startssl.com/ 申请过程: 1)填写资料 2) 获取得验证码 3)提交验证码,等待6小时审核. 4)再次获得验证码,提交等待审核 5)审核 ...

  8. php编译错误Note that the MySQL client library is not bundled anymore!

    Note that the MySQL client library is not bundled anymore! 解决方法. 1. 查看系统有没有安装mysql header find / -na ...

  9. subversion SVN global ignore pattern

    *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo *.rej *~ #*# .#* .*.swp .DS_Store */bin */ ...

  10. jenkins与rebotframework搭配

    一.下载Jenkins 下载地址:http://mirrors.jenkins-ci.org/ 贫道比较推荐下载war包的,进入上面的地址,页面里有war的链接,各种类型各种版本的release,大家 ...