簡體   English   中英

使用窗體身份驗證登錄時使用WindowsIdentity獲取ASP.NET中的文件/目錄列表

[英]Using WindowsIdentity to get a list of files/directories in ASP.NET while logged in using Forms Authentication

編輯7:
我猜想這畢竟不可能完成,可能需要使用某種命令行應用程序來完成並解析輸出,盡管我希望當很多人正在訪問文件夾和/時這可能會很慢或達到NetBIOS會話限制。

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

5個月,除了“使用模擬”(似乎是通過P / Invoke,因為內置的.NET方式看起來如此脆弱)之外,仍然沒有解決方案,但這也將有相同的問題。 硬編碼的用戶名/密碼不是一種選擇。

Web服務器中內置的“開發”(Windows 7)框(使用IIS或Visual Studio)運行正常。

編輯5:
根據我在互聯網上閱讀的內容以及有關此問題的信息,唯一可行的方法是:

  • 基本認證
  • 假冒
  • 將文件與Web應用程序放在同一服務器上

這些都不是一個選擇

  • 用戶每次都必須登錄-缺點:額外的進入障礙,應該是無縫體驗
  • 硬編碼的用戶名和密碼-缺點:密碼更改,用戶編碼的用戶(asp.net帳戶)無法訪問文件
  • Web服務器上存儲的文件太多,磁盤空間不足

由於必須有可以訪問UNC共享文件的Windows窗體應用程序,因此我認為這樣做會起作用。 那,以及當遠程連接到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. 啟用表單身份驗證,可以連接數據庫但不能訪問文件(由於InvalidCastException因為Identity現在是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 (如果我以客戶端PC上的同一用戶遠程連接到IIS框,則可以訪問該文件) 。

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

正如RichardOD所說的那樣,您將難以運行IIS和WebDev上給出的代碼。

最佳選擇是“項目”>“屬性”>“ Web”>“使用本地IIS Web服務器”。

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

編輯以回應評論:我看來OP需要進行一些硬核模擬:

我過去曾使用代碼從背后的代碼中以另一個用戶身份連接到UNC。 還有一個更新的版本看起來不錯,但是我沒有使用過,所以不能擔保。

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

您是說要使用內置Web服務器(Cassini)? 模擬功能與IIS中的功能不同(請參閱Cassini認為是有害的 )。 您可以將IIS用作Visual Studio中的Web服務器。 我通常這樣做是因為它可以防止出現類似這樣的奇怪的部署時間問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM