在 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 获取当前用户访问令牌?不是应用访问令牌