【问题标题】:Restricting file access to certain users to certain folders限制某些用户对某些文件夹的文件访问
【发布时间】:2012-05-24 13:54:02
【问题描述】:

我有一个网站,用户使用表单身份验证登录该网站,我想限制特定用户访问特定文件夹中的文件。

因此,例如,user1 可以访问文件夹 dir/foo,但 user2user3 不能访问,user2 可以访问文件夹 dir/bar,但 user1user3 不能访问文件夹 dir/bar

上述文件夹不是在我部署站点时创建的。它们是在网站的整个生命周期中创建的,我可以通过代码(通过文件名)知道谁应该有权访问哪些文件。

我的设置是这样的,我有一些具有Member 角色的用户。 Member 代表一家公司。每个Member 都有角色为SellerBuyerViewer 的用户。现在,每个用户,无论他是MemberSellerBuyer 还是Viewer,都应该能够看到属于他公司的文档。所以,如果Seller1 有一个文档a.txt 那么Seller1 应该可以看到它,Member1 应该可以看到它(Member1Seller1 所属的公司),Buyer1应该可以看到(属于Member1),Viewer1应该可以看到(属于Member1),但是Buyer2应该看不到(如果他属于Member2 )。文档放置在以文档所属用户的名称命名的文件夹中。例如,属于Seller1 的文档位于名为Seller1 的文件夹中。此外,还有一个名为Admin 的用户可以查看所有文档。

我该怎么做?

【问题讨论】:

标签: c# authentication iis-7 web-config authorization


【解决方案1】:

您可以在 web.config 文件中执行此操作。如果您将用户组织成组会更好,但可以逐个用户地进行:

<configuration>
    <system.web>
        <authorization>
            <!-- GLOBAL authorization -->
            <allow users="user1" />
            <deny users="user2, user3"/>
            <allow roles="GoodUsers" />
            <deny roles="BadUsers, MouthBreathers"/>
        </authorization>
    </system.web>
    <!-- local individual folder/file authorization
    <location path="/dir/foo">
        <system.web>
            <authorization>
                <allow users="user1" />
                <deny users="user2, user3"/>
                <allow roles="GoodUsers" />
                <deny roles="BadUsers, MouthBreathers"/>
            </authorization>
        </system.web>
    </location>
</configuration> 

编辑: 鉴于您更新的描述添加了文档管理方面和将公司添加到组合中的附加过滤器,您可以通过几种方法来做到这一点。我建议的主要方法是将所有文档放在根文件夹之外,这样任何随机用户都无法浏览它们。然后构建一个提供搜索能力的基于页面的界面。根据文件夹/文档的数量,这可以通过多种方式完成。如果每个文件夹的文档数量很少(每个文件夹少于 1000 个,少于 1000 个文件夹),那么您可以轻松地让您的系统直接访问文件系统以提供对这些文件列表的读取访问权限。如果您有更多,我建议您使用外部机制将这些文件索引到易于搜索的数据库中。然后您的界面将负责确定谁可以看到哪些文件。

最后,为了向用户提供文件,您将构建第二个页面,其具体职责是获取特定文件并将其作为二进制流提供。

【讨论】:

  • 但是网站上会一直创建新用户。
  • @SachinKainth - 这就是为什么我建议为用户使用组。这样,只需将用户添加到组中。我将发布一个编辑,说明它是如何受组(角色)限制的。
  • 没有那么简单。解释起来很长,但逻辑必须在代码中处理。
  • @SachinKainth - 你需要解释一下。到目前为止,您所解释的内容很容易通过组完成。您需要解释不能使用群组的原因,或者更详细地解释您的问题。
  • @SachinKainth:第一页应该相当简单。在页面执行期间,您拥有组,因此您只需提供一种基于文件夹结构的过滤/搜索方式。您将使用DirectoryInfo 类执行结构化搜索以生成文件列表。至于传递文件,它将通过Response.BinaryWrite 完成——例如:stackoverflow.com/questions/848679/…
猜你喜欢
  • 2012-05-26
  • 2012-05-31
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2012-08-23
  • 1970-01-01
相关资源
最近更新 更多