ASP.NET从受密码保护的网络共享中读取文件

时间:2009-09-30 04:04:22

标签: asp.net networking share

我在Windows 2003 Server上有一个ASP.NET网站,需要从网络共享中访问文件。网络共享受密码保护,需要提供用户名和密码。

我在网站上使用基于表单的身份验证,而不是基于Windows。

所以我的问题是,当我尝试使用下面的代码从networkshare读取任何文件时,它会拒绝访问 DirectoryInfo networkShare = new DirectoryInfo(“\\ TestServer \ Share”);

所以我尝试通过向impersonate函数调用提供网络共享的用户名和密码来使用Impersonate,但是由于ASP.NET Web服务器上不存在该用户名,因此调用显然失败。所以我传递了网络服务器上存在的登录名的用户名和密码,所以这次模拟通话有效,但是仍然无法访问网络共享'因为网络共享用户名和密码不同。

最后,我在网络服务器上创建了与网络共享相匹配的完全相同的用户名/密码。这次模拟函数调用工作,网络共享也是如此。我能够成功地从共享中读取。

所以我的问题是,有没有办法在不添加网络服务器用户名的情况下阅读网络共享。 '每次网络共享登录更改时,我都必须再次在网络服务器上创建一个新的用户名。哪个不理想。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

执行此操作的“正确”方法是将Web服务器的AppPool作为可以访问共享的标识运行。这样,唯一的凭据存储在IIS配置中安全地完成(而不是在您的代码或可读的配置文件中)。将Web服务器和文件服务器放在同一个Windows域(或具有信任的不同域)是最简单的方法,但“相同的用户名/密码”事物也应该在那里工作。

如果您不关心在您的代码或配置中放置用户名/密码,您可以P / Invoke到WNetAddConnection2并传递用户名/密码 - 然后您应该能够访问该共享。这不需要Web服务器具有匹配的帐户,但您确实应该保护密码(查看System.Security.Cryptography.ProtectedData以获取加密的注册表存储)。

答案 1 :(得分:0)

试试这个

WebRequest request = WebRequest.Create( "http://server/file.xml" );
request.PreAuthenticate = true;
request.Credentials = new NetworkCredential( "user", "pass" );

request.GetResponse();