我在IIS 7中的默認網站下有一個應用程序,並且每當我嘗試訪問同一個域(但不同的計算機)上的另一個文檔時,File.Exists
返回False
,即使該文件確實存在,我可以通過託管該站點的計算機訪問它。設置的AD部分似乎工作正常,我只是無法訪問域中不同機器上的文檔。這裏是我的IIS設置:File.Exists在Active Directory環境中返回False
應用程序池:.NET 4.0,集成管道和使用ApplicationPoolIdentity標識。我試過使用NetworkService,但這似乎沒有什麼區別。
身份驗證:我的應用程序僅啓用了ASP.NET模擬和Windows身份驗證。 bin文件夾是相同的。
如果還有什麼與IIS設置相關的,請讓我知道,我會得到它添加。
我也試過授予我的機器完全權限的文件夾,我試圖訪問該文件(這是在另一臺機器在同一個域中)。這似乎也沒有區別。
有沒有人遇到過這種情況,或知道其他任何我可以嘗試或知道的任何IIS設置,我可以檢查?如果在我的設置中還有其他任何相關內容,請告訴我!
UPDATE:
是否有可能找出使用什麼樣的身份或誰被假冒時System.IO.File.Exists()
被調用,或者更具體地說找出誰該方法如,假冒?我試過在調用File.Exists()
之前檢查Thread.CurrentPrincipal.Identity.Name
,並且正確返回我的域用戶。
因此,執行File.Exists()
時看起來不是用戶正在模擬。更重要的是,如果在IIS中,我更改ASP.NET模擬(在身份驗證設置中)以使用我的特定域用戶,一切正常!但是,當我改回它使用「認證用戶」,它不?
我也可以確認在File.Exists()
之前調用Principal.WindowsIdentity.GetCurrent.Name()
也會返回正確的域用戶。
更新2:
我也嘗試應用程序池標識設置爲我的特定領域的用戶,這似乎不有所作爲無論是。在這一點上,我不確定當檢查文件是否存在時,可以模擬其他帳戶?
更新3:
我擁有我想訪問文件的設備上使用Process Monitor試過了,但是當我篩選下來到我要找的文件類型(或期待看到),當我重新運行我的測試時什麼也沒有顯示。我只能假定對你無權訪問的文件執行File.Exists()
,不會註冊到進程監視器?有沒有其他方法可以找出哪個模擬用戶/服務嘗試(無法)訪問這些文檔?
UPDATE 4:
使用下面@約翰發現的例子,我已經試過檢查之前以編程模擬登錄的用戶,如果該文件存在:
Dim wID As WindowsIdentity = HttpContext.Current.User.Identity
Dim ctx As WindowsImpersonationContext = Nothing
ctx = wID.Impersonate()
If System.IO.File.Exists(sFile) Then
Else
'Still gets here?
End If
然而,File.Exists()
即使在模仿時仍然會返回錯誤。
UPDATE 5(液):
,我需要這樣的:
Using ctx As System.Security.Principal.WindowsImpersonationContext = System.Security.Principal.WindowsIdentity.Impersonate(IntPtr.Zero)
'My code here
End Using
謝謝你的回覆,但我加倍檢查,我已經正確設置了這些設置。另外,在IE中測試沒有區別(我之前使用Chrome)。 – lhan 2013-03-05 13:41:21
其實,最後一點的工作 - 當我將ASP.NET身份驗證從「身份驗證用戶」更改爲我的帳戶專門,它工作正常。我不明白爲什麼當它被設置爲「Authenticated User」時它沒有使用我的帳戶?更重要的是,當使用「Authenticated User」時,我甚至在檢查文件是否存在之前嘗試調用'Thread.CurrentPrincipal.Identity.Name',並確保它返回正確的「domain \ username」,並且它! – lhan 2013-03-05 13:52:42
它與Web服務器無法通過Kerberos將憑據傳遞到遠程計算機有關,請參閱http://forums.iis.net/t/1114220.aspx/1以獲取解釋。有另一種方式我使用編程模擬當您需要檢查該文件,請參閱http://msdn.microsoft.com/en-us/library/ff647404.aspx – john 2013-03-05 23:03:31