代码之家  ›  专栏  ›  技术社区  ›  ace

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

  •  0
  • ace  · 技术社区  · 15 年前

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

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

    所以我的问题是,当我试图使用下面的代码从网络共享中读取任何文件时,它抛出拒绝访问。 directoryinfo networkshare=new directoryinfo(“\\testserver\share”);

    因此,我尝试通过向模拟函数调用提供网络共享的用户名和密码来使用Impersonate,但是调用显然失败,因为该用户名在ASP.NET Web服务器上不存在。所以我传递了一个登录名的用户名和密码,这个登录名确实存在于Web服务器上,所以这次模拟调用可以工作,但是它仍然不能访问网络共享,因为网络共享用户名和密码是不同的。

    最后,我在Web服务器上创建了与网络共享完全相同的用户名/密码。这次模拟函数调用有效,网络共享也有效。我可以成功地从共享中读取。

    所以我的问题是,有没有一种方法可以在不在Web服务器中添加用户名的情况下读取网络共享。”因为每次网络共享登录更改时,我都必须在Web服务器中再次创建一个新的用户名。这不太理想。

    有什么想法吗?

    2 回复  |  直到 15 年前
        1
  •  2
  •   nitzmahone    15 年前

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

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

        2
  •  0
  •   Arsen Mkrtchyan    15 年前

    试试这个

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