如何将特定目录下文件的浏览权限和下载权限分离开来。

这是一个非常有意义、非常令人兴奋的事情,如果能够将特定目录下的浏览权限和下载权限分离开来的话。如果单纯的依靠操作系统和服务器来看,就微软现在提供的功能来说是非常困难的(几乎是无法实现的)。这个教训是我在苦苦思索了一个多月和查阅了无数资料的基础上得来的。
但是幸运的是这个问题不是没有办法解决的。以下我来说说实现的方法和思路。
    一直以来,我总是在考虑这个问题。但是通过我查阅无数的资料,至今没有(全世界范围内)有人将这个功能用于实际的项目中。
    我的最终目标是实现“我”的文件夹下的文件只允许我指定的人来下载,但是所有人都可以浏览。由此看来这种权限的分离是彻头彻尾的分离。是否允许下载是可以完全控制的。因为它具体到了每个人(即每个ID)。而且这不是基于组策略的实现。组策略不是我想要的方式,原因是用组策略不自由,不是我完全可以控制的。
    再一个想法是这种分离也不是基于角色(role)的,原因和组策略相同。我的要求是以每个用户为中心,即中心是可变的。也就是说每个人都可以指定其特定文件夹下的文件可以被指定的人来下载。everyone 有一个浏览权限(必须有的)。
    还有一个要说的是这种分离不能有文件夹下的webconfig来实现。原因是如果使用webconfig来实现的话,其可选得操作就是基于组和角色。他不能是基于函数的(或者说是基于表达式的)。所以这也不是我想要的方式。我想要得效果类似于,如果来访者的ID和我的ID有某种关系。如果这种关系成立则是可以下载的。否则,对不起,你只能看看而已。
   由此看来,这种要求近似苛刻,但是没错,这就是我想实现的功能。
   (如果你可以由此产生些联想之类的话,祝贺你,你可以大有作为了。你可以在下面回复告诉我你的想法。)
   不要绝望,这看起来很难实现,但是我已经找到解决的办法了。
    这种方法其实很简单,只是思想的转变而已。但是经过了这个简单的转变你可以发现天地是多么的宽广。
    下面来说说这个转变方式。
    首先,做好你的关于以某个人为中心的可以下载文件的表达式。这个很简单。但是每个人都是不同的表达式(张三给李四买了一瓶酒,李四喝完觉得不错,“好哥们你来下载吧”。如果是假酒,李四大火“什么玩艺也来给我喝,不让你下”。这里是以李四为中心,张三为判断条件的)。
    做好了判断条件之后就是给他下载链接了。这点容易。给你下载就是。
    如何让所有人都可以浏览的实现是这里的重点。这里要用到的一个概念就是伪装。(没办法,微软不给实现就自己想办法了)。这里就是用一行代码来生成list一个文件夹下所有文件的功能。把文件的属性读出来。表示出来。地址就不要现示了。当一个ID点击之后就联动这个文件夹的主人的表达式。可以了,打开下载地址。否则,deny。如果没有注册,点击后打开注册页面。
    至此,你可以看到我们要实现的功能都已经实现。关键是一个实现的思路问题。我们已经找到了。(如果你还有更好的实现方法请您告诉我。)我们期望微软在以后的服务器或者是dotnet框架升级的时候,可以修改一下。能够给我们留下更多的选择余地,或者给我们留一个interface。让我们实现的更简单一点。

posted on 2007-12-03 20:31 woog 阅读(1814) 评论(10)  编辑 收藏

评论

#1楼  2007-12-03 21:19 560889223      

我没仔细看文章,但就标题我提一个问题:
浏览是指知道文件的路径以及文件名吗?还是指可以知道文件的内容?
如果是后者的话,已经等效于下载了,至少客户端能够获取文件的内容数据。
如果是前者的话,我可以通过NTFS的权限控制做到,不过唯一的不便是基于目录的(以目录为最小粒度)。   回复  引用  查看    

#2楼 [楼主] 2007-12-03 21:26 woog      

@560889223
这里的浏览指的是知道文件的名称、种类、概要等一些属性。对于这些属性我们要做的就是把它抽出来交给浏览者。
这里的目录确切说应该是基于用户的。即网站的会员系统。其最小粒度是各个用户所拥有的文件。这里提出的是一种模式。也是一种解决办法。   回复  引用  查看    

#3楼  2007-12-03 21:46 A1 [未注册用户]

你说的到底是文件内容的浏览还是目录的浏览呢?我想是后者吧。因为要是前者,那就意味着已经下载。
如果是后者,那这个应用里所包含的技术实在简单到不能再简单了。更不是你说的什么世界没有先例,而是可以作为web界的考古项目了都。

你想想那些需要注册会员才能下载的程序和你文中所说的场景有什么不同?
仅仅是你的例子中网络路径和物理存储目录的关系更直观而已。
身份验证、权限设置全都放到数据库中,至于存储文件的目录,如果你怕被人绕过安全机制直接访问,在IIS中你可以通过配置web.config或者加一个handler 来限制.

而你所指无法直接在web服务器上配置也是不正确的。
你可以设定这个目录要求集成身份认证同时允许匿名访问,但是匿名帐户只有列出目录的权限。如果要读取文件就必须先通过身份认证,web服务器自然会根据登录的帐户(或其所在的用户组)的权限设定来判定是否能下载。
对于IIS,集成身份验证只能是windows身份验证。
Apache的集成身份验证可以通过模块从一个身份验证数据库来确定,并将其映射到特定的帐户(组).
  回复  引用    

#4楼 [楼主] 2007-12-03 21:55 woog      

@A1
我这里说的是浏览特定用户目录下面的文件,即特定文件夹下的文件,包括现示文件名称,文件所有者,以及文件生成日期等一些文件的属性。不是目录的权限控制。也不是所有的文件的控制。是特定的目录或者是特定的文件所有者--的--文件--的浏览和下载权限的分离。   回复  引用  查看    

#5楼  2007-12-03 23:45 oyeah [未注册用户]



我看楼主在吹毛求疵

不知所云

把根鸡毛当做宝剑


简单问题复杂化


  回复  引用    

#6楼  2007-12-04 01:29 老刀把子      

引用--------------------------------------------------
woog: @A1
我这里说的是浏览特定用户目录下面的文件,即特定文件夹下的文件,包括现示文件名称,文件所有者,以及文件生成日期等一些文件的属性。不是目录的权限控制。也不是所有的文件的控制。是特定的目录或者是特定的文件所有者--的--文件--的浏览和下载权限的分离。
--------------------------------------------------------
FTP服务器都可以设的啦,
装个Serv-u 看看。 list, read ,等权限都可以分离的。   回复  引用  查看    

#7楼  2007-12-04 02:17 Soli      

我觉得lz的意思是这样滴:有一台服务器S(比如博客园),有若干用户a,b,c,d。a向S上传了一个文件(自己的日记啦、照片了之类的),b,c,d三个用户可以知道a上传了个什么东东,但这个东东的内容呢,得通过a允许才能看。而a并不想让所有人看这个文件的内容,他只想让b和c看。而a只是S的普通用户,他没有权限更改S的配置文件,更别说什么组策略、NTFS权限了。

如果lz是这个意思的话,还真挺简单的。对用户上传的每一个文件弄个白名单,不就行了?而文件的上传者可以自由修改这个白名单。服务端在显示文件信息时,查一下白名单以决定是否给出下载链接。

不过lz所说的“表达式”的概念不错。即对应每个上传得文件不是一个白名单,而是一个表达式,文件上传者可以自定义这个表达式。表达式和白名单的区别是什么呢?白名单只能列出某某人可以下载此文件,但表达式则可以实现复杂的逻辑,比如:我的好友中浏览过我的页面100次以上的且阅读过我的某一篇博客并评论过的人才有权下载此文件。

感觉lz似乎在做myspace或校内网之类的交友型的网站。

  回复  引用  查看    

#8楼  2007-12-04 09:02 Enzo      

若楼主如@Soli说的情况,确可以实现

  回复  引用  查看    

#9楼 [楼主] 2007-12-04 10:30 woog      

@Soli
soli说的不错。正是这种情形,找到知音了。呵呵   回复  引用  查看    

#10楼  2007-12-04 17:18 aaabbb [未注册用户]

用文件存储系统不就行了吗,www.domstorage.com   回复  引用    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接:
 




导航

<2007年12月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

统计

与我联系

搜索

 

常用链接

留言簿

随笔档案

c#

其他

最新评论

阅读排行榜

评论排行榜