2008-08-27 51 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路徑。