我有一个需要从网络共享中读取(并可能写入)文件的Web应用程序。我想知道最好的方法是什么?
我不能给网络服务或aspnet帐户访问网络共享。我可以使用模仿。
网络共享和Web应用程序都托管在同一个域上,我可以专门为此目的在域上创建一个新用户但是我不太确定如何在创建文件流和指定文件流之间加入点要在Web应用程序中使用的凭据。
不幸的是,驱动器未映射为计算机上的网络驱动器,它仅作为网络共享提供给我,所以很遗憾我无法进行透明呼叫。
我可以通过模拟来考虑一个问题......我只能模仿每个应用程序域中的一个用户认为但我很高兴能够得到纠正。我可能需要将此文件写入多个不同的共享,这意味着我可能需要冒充几个用户。
我喜欢创建令牌的想法...如果我能做到这一点,我将能够预先使用他们的凭据,然后动态应用安全性,并在访问被拒绝时给他们提供有意义的错误消息。 ..我要去玩了,但我会回来更新。
答案 0 :(得分:3)
鉴于每个人都已拥有域帐户。尝试IIS集成身份验证。您将从网络上获得一个丑陋的登录框,但您的信用卡应该传递到文件共享。
@lomaxx
你是说只有你有共享权限或手动将其映射到驱动器号。如果以后你可以使用ucn \ host \ share,就像使用c:\ shared_folder一样。
随机 将共享镜像到主机上的本地文件夹会是一种负担吗?我听说ROBOCOPY非常方便。
另一个想法。在您的目标共享上运行IIS,您可以通过http阅读,如果您需要编写调查webdav。
答案 1 :(得分:0)
我没有问题透明地连接到网络共享,就好像它们是本地驱动器一样。您可能遇到的唯一问题是您提到的问题:让aspnet
帐户获得对共享的访问权限。假冒可能是最好的方法。
只要服务器计算机上有驱动器盘符,您就应该可以使用任何文件流对象来访问网络共享。
答案 2 :(得分:0)
在这种情况下,模拟对我很有用。我们有一个通过网站上传zip文件的向导,但我们负载均衡了网站。因此需要设置一种在所有机器上保存文件的方法。
有很多不同的方法可以做到这一点。我们决定在我们设置的用户下运行所有请求,然后添加web.config条目并为用户设置文件夹的安全权限。这篇kb文章很好地解释了设置。
答案 3 :(得分: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
建立与服务的关系以获取您的令牌,然后您即可参加比赛。另一个好处是这个服务是内部的,可信任的,我之前甚至将它托管在文件服务器上,所以给这个操作授予权限要容易得多。
答案 4 :(得分:0)
如果您可以创建新的AD用户,我认为最简单的解决方案是让应用程序池在该AD帐户的权限下运行,这意味着您的应用程序现在作为AD用户运行。您需要将AD用户添加到运行应用程序的计算机上的IIS工作进程组。然后,只要您的AD用户对网络共享具有写入权限,您就应该能够在文件操作中使用UNC路径。