从c#web app中的网络共享访问文件

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

我不能给网络服务或aspnet帐户访问网络共享。 我可以使用模仿。

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


遗憾的是,驱动器未映射为计算机上的网络驱动器,它仅作为网络共享提供给我,所以不幸的是我无法进行透明呼叫。

我可以通过冒充来考虑一个问题…我只能冒充每个应用程序域的一个用户,但我很高兴能够得到纠正。 我可能需要将此文件写入多个不同的共享,这意味着我可能需要冒充几个用户。

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

鉴于每个人都已拥有域帐户。 尝试IIS集成身份validation。 您将从网络上获得一个丑陋的登录框,但您的信用卡应该传递到文件共享。

@lomaxx
你是说只有你的共享权限或手动将其映射到驱动器号。 如果以后你可以使用ucn \ host \ share,就像使用ac:\ shared_folder一样。

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

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

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

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

在这种情况下,模仿对我很有用。 我们有一个通过网站上传zip文件的向导,但我们负载均衡了网站。 因此需要设置一种方法来保存所有计算机上的文件。

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

你确实有一些选择,其中一个就是你所提到的冒充。 但是,我喜欢使用并在过去使用过的另一个是受信任的服务电话。 让我们假设一下,通过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建立与服务的关系以获取您的令牌,然后您即可参加比赛。 另一个好处是这个服务是内部的,可信的,我甚至以前将它托管在文件服务器上,因此更容易为此操作授予权限。

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