2010-02-23 28 views
0

編輯7:
我猜這後不能全部完成,可能需要使用某種命令行應用程序來執行此操作並解析輸出,但我期望在很多人訪問該文件夾和/或達到NetBIOS會話限制時,這可能會非常緩慢。使用的WindowsIdentity獲得的文件/目錄在ASP.NET的列表,而在使用窗體身份驗證登錄

編輯6:
使用Windows集成身份驗證(使用具有訪問共享和數據庫的賬號),我可以得到的文件/目錄列表。但是,刷新頁面並獲得UnauthorizedAccessException。也許是NetBIOS或ActiveDirectory限制。

5個月,仍然沒有解決方案,除了'使用模擬'(通過P/Invoke似乎,因爲內置的.NET方式看起來如此片面),但也會有同樣的問題。硬編碼用戶名/密碼不是一個選項。

發展(Windows 7)中框(使用IIS或Visual Studio的)內置的Web服務器)能正常工作..

編輯5:
從我已閱讀在互聯網上,在這個問題上,對於這項工作的唯一途徑是:

  • 基本身份驗證
  • 模擬
  • 有相同的服務器Web應用程序012上的文件

這些都不是一個選項,因爲無論是

  • 用戶每次都要登錄 - 缺點:額外的進入壁壘,應該是一個無縫的體驗
  • 用戶名和密碼硬編碼 - 下行:密碼更改,用戶在編碼​​(asp.net帳戶)將無法訪問這些文件
  • 太多的文件存儲在Web服務器上,沒有足夠的磁盤空間

由於必須有可以訪問UNC共享文件的Windows Forms應用程序,因此我原以爲這會起作用。這一點,以及遠程連接到Web服務器和使用Windows資源管理器時的事實,我可以訪問這些文件。

也許ASP.NET/IIS安全可以防止他人未經通過P/Invoke的模擬以往工作。或者可能被防火牆阻止?

編輯4:
一件事,做的工作是使用基本身份驗證 - 集成Windows身份驗證和摘要式身份驗證不。然而,這是不是真的如密碼以明​​文形式發送,當他們訪問的頁面(不是我想做的事),用戶會得到一個提示的選項。

編輯3:
無論我怎麼努力,我不能讓一個UNC路徑上的文件或目錄的列表(包括這些的組合和單獨打開)

  1. 鑑於「每個人的完全訪問的文件夾(不只是讀)
  2. 鑑於ASP.NET帳戶‘充當操作系統’
  3. 鑑於IIS_WPG組「充當操作系統的一部分
  4. 的一部分二手 <authentication mode="Windows" />
  5. 使用<identity impersonate="true"/>

如果我遠程(使用RDP)具有相同的帳戶連接到服務器,因爲我用它來登錄到該網站,我可以訪問這些文件的罰款。它只是不通過代碼工作。

編輯2:
我曾嘗試是:

  1. 打開Windows身份驗證:當同一臺機器(不UNC共享)上,無法連接到數據庫
  2. 文件只能訪問
  3. 打開表單身份驗證,可以連接到數據庫但不訪問文件(由於InvalidCastException,因爲身份現在是GenericIdentity

我無法使用Windows身份驗證,因爲我無法添加角色。我不想提示輸入用戶名/密碼,因爲這是一個額外的步驟,並且不是通過安全連接(即SSL)。此外,我不能讓ASP.NET帳戶訪問這些文件(因爲我不是域管理員)。

編輯:
的路徑是一個UNC路徑,而不是在本地PC上。

使用表單身份驗證,當我嘗試在Visual Studio中將當前用戶身份轉換爲WindowsIdentity並調試時,我得到一個InvalidCastException。我只是有:

WindowsIdentity id = (WindowsIdentity)HttpContext.Current.User.Identity; 

然後我得到的錯誤是:

Unable to cast object of type 'System.Security.Principal.GenericIdentity' to type 'System.Security.Principal.WindowsIdentity' 

我使用模擬得到的文件列表,因爲ASP.NET帳戶不具有訪問這些文件。它使用IIS的時候,而不是在Visual Studio的工作原理:

WindowsIdentity id = (WindowsIdentity)User.Identity; 
using (System.Security.Principal.WindowsImpersonationContext context = id.Impersonate()) 
{ 
files = Directory.GetFiles("\\server\share"); 
context.Undo(); 
} 

添加<identity impersonate="true" />web.config沒有做任何事情 - 雖然我不想這樣做,因爲我使用ASP.NET帳戶查詢數據庫,用戶沒有訪問權限(導致Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON')。

當我打開通過在web.config Windows身份驗證我再拿到UnauthorizedAccessException試圖讓文件從遠程共享列表(當我否則可能會訪問,如果我遠程連接到IIS箱相同的用戶上客戶端PC)。

此外,ASP.NET帳戶是在Active Directory中,而不是設置帳戶本地IIS。

回答

1

由於RichardOD說,你將不得不運行代碼在IIS和Webdev的兩個給出的麻煩。

你最好的選擇是項目>屬性>網絡>使用本地IIS Web服務器。

否則,您需要修改訪問控制策略。

編輯迴應評論: 我看來OP需要做一些鐵桿模擬:

我已經使用在過去this代碼連接到UNC從代碼隱藏其他用戶。還有一個更好的current version,但我沒有使用它,所以不能擔保。

這可能有幫助,可能不會。值得一試。

+0

雖然表單身份驗證用於登錄該網站出於管理目的,但它起作用。儘管嘗試做一個混合風格的系統,因爲很多網站已經使用表單身份驗證和角色系統來確定用戶可以訪問和做什麼。 – SamWM 2010-02-23 16:20:05

+0

@Sam,那麼你爲什麼試圖遊蕩流氓傢伙? ;-)在開發機器上授予你自己的NTFS權限,因爲這是運行cassini的身份。 混合模式是一個非常糟糕的主意,並會導致臭味的代碼。 – 2010-02-23 16:26:40

+0

我想使用不屬於Active Directory的自定義角色,因爲我無權創建安全組。打開Windows身份驗證後,我不能使用「admin」或「documents」等表單身份驗證角色。 – SamWM 2010-02-23 16:59:31

0

你的意思是使用內置Web服務器(卡西尼)?模擬與IIS中的工作方式不同(請參閱Cassini considered harmful)。您可以在Visual Studio中將IIS用作Web服務器。我通常會這樣做,因爲它可以防止這種奇怪的部署時間問題。