在 C# Web 应用程序中从网络共享访问文件

Posted

技术标签:

【中文标题】在 C# Web 应用程序中从网络共享访问文件【英文标题】:Access files from network share in c# web app 【发布时间】:2010-09-06 23:01:12 【问题描述】:

我有一个 Web 应用程序需要从网络共享读取(并且可能写入)文件。我想知道最好的方法是什么?

我无法让网络服务或 aspnet 帐户访问网络共享。我可能会使用模拟。

网络共享和 Web 应用程序都托管在同一个域上,我可以专门为此目的在域上创建一个新用户,但是我不太确定如何在创建文件流和指定在 Web 应用程序中使用的凭据。


很遗憾,该驱动器没有映射为机器上的网络驱动器,它只能作为网络共享提供给我,所以很遗憾我无法进行透明调用。

我能想到一个关于模拟的问题...我认为每个应用程序域只能模拟一个用户,但我很高兴得到纠正。我可能需要将此文件写入多个不同的共享,这意味着我可能必须模拟多个用户。

我喜欢创建令牌的想法...如果我能做到,我将能够预先询问使用他们的凭据,然后动态应用安全性并在访问被拒绝时给他们有意义的错误消息。 .. 我要去玩了,但我会回来更新的。

【问题讨论】:

【参考方案1】:

鉴于每个人都已经拥有域帐户。尝试 IIS 集成身份验证。你会在网络上得到一个丑陋的登录框,但你的凭据应该传递给文件共享。

@lomaxx 您是说只有您拥有共享权限,还是您手动将其映射到驱动器号。如果是后者,您可以像使用 c:\shared_folder 一样使用 ucn \host\share。

随机 将共享镜像到主机上的本地文件夹会是一种负担吗?我听说 ROBOCOPY 非常方便。

另一个想法。在您的目标共享上运行 IIS,您可以通过 http 读取,如果您需要编写调查 webdav。

【讨论】:

【参考方案2】:

透明地连接到网络共享,就好像它们是本地驱动器一样,我没有遇到任何问题。您可能遇到的唯一问题是您提到的:让aspnet 帐户获得对共享的访问权限。模拟可能是最好的方法。

您应该能够使用任何文件流对象来访问网络共享,只要它在服务器计算机上有一个驱动器号。

【讨论】:

【参考方案3】:

在这种情况下,模拟对我来说效果很好。我们有一个通过网站上传 zip 文件的向导,但我们对网站进行了负载平衡。因此需要设置一种在所有机器上保存文件的方法。

有许多不同的方法可以做到这一点。我们决定让所有请求在我们设置的用户下运行,并添加 web.config 条目并为用户设置文件夹的安全权限。这篇kb 文章很好地解释了设置。

【讨论】:

【参考方案4】:

您确实有一些选择,其中之一就是您提到的模仿。但是,我喜欢使用并且过去使用过的另一个是受信任的服务调用。让我们暂时假设通过 IIS 限制访问以确保尽可能少的漏洞总是更安全。有了这个,让我们沿着这条路走吧。

构建一个有几个入口点的 WCF 服务,界面可能如下所示。

public interface IDocumentService

    public string BuildTrustedRelationship(string privateKey);

    public byte[] ReadFile(string token, string fileName);

    public void WriteFile(string token, string fileName, byte[] file);

现在,您可以非常轻松地通过 Windows 服务托管此服务,因此您现在只需在 Application_start 上与该服务建立关系以获取您的令牌,然后您就可以参加比赛了。这里的另一个好处是该服务是内部的、受信任的,而且我之前什至将它托管在文件服务器上,因此授予此操作的权限要容易得多。

【讨论】:

【参考方案5】:

如果您可以创建一个新的 AD 用户,我认为最简单的解决方案是让应用程序池在该 AD 帐户的权限下运行,这意味着您的应用程序现在以 AD 用户身份运行。您需要将 AD 用户添加到运行应用程序的计算机上的 IIS 工作进程组。那么只要你的 AD 用户对网络共享有写权限,你应该可以在你的文件操作中使用 UNC 路径。

【讨论】:

以上是关于在 C# Web 应用程序中从网络共享访问文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 上运行的 Web 应用程序中从 CamScanner 或 Office Lens 获取文件?

如何在 C# 中从 Facebook SDK 获取当前用户访问令牌?不是应用访问令牌

如何在单个项目中从 C# 中的多个配置文件中读取值?

如何在wpf c#中从数据表导出到excel文件

如何修复访问被拒绝路径错误asp.net应用程序访问网络共享

在 c# 中从其他资源中引用嵌入式资源