2008-08-27 50 views
8

我有一个web应用程序需要从网络共享中读取(也可能写入)文件。我想知道做这件事的最好方法是什么?从c#web应用程序中的网络共享访问文件

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

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


不幸的是,驱动器没有被映射为计算机上的网络驱动器,它只是作为一个网络共享提供给我,所以很遗憾,我不能做一个透明的呼叫。

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

我喜欢创建令牌的想法...如果我可以这样做,我将能够提前使用它们的凭据,然后动态应用安全性,并在访问被拒绝时为它们提供有意义的错误消息...我打球了,但我会回来更新。

回答

0

我没有问题透明地连接到网络共享,就好像它们是本地驱动器一样。您可能遇到的唯一问题就是您提到的问题:使aspnet帐户可以访问该共享。冒充可能是最好的方法。

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

0

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

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

3

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

@lomaxx
你是说你只有共享的共享或手动映射到驱动器号。如果以后你可以使用ucn \ host \共享相同的方式,你可以使用c:\​​ shared_folder。

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

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

0

你确实有一些选择,其中之一就是你提到的模仿。然而,另一个我喜欢使用并且在过去使用的是值得信赖的服务呼叫。让我们暂时假设通过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与服务的关系,让您的令牌,你是去比赛。这里的另一个好处是这个服务是内部的,可信的,我甚至在文件服务器上托管过它,所以授予这个操作权限要容易得多。

0

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