IIS7 上的 ASP.NET 身份驗證問題 - 對於 Windows 身份驗證,User.Identity.Name 為空
我們在 ASP.NET 4.0 上有一個使用 MVC 3 的 ASP.NET 應用程序,它使用 Windows 身份驗證。
當從 Visual Studio 2010 執行時,一切都按預期工作,但當推出到 IIS7 時,Windows 登錄使用者永遠不會被填充(檢查 User.Identity.Name)。也沒有出現使用者憑據的對話框提示。
web.config 設置:
<authentication mode="Windows" />在 IIS 中,我可以看到 Windows 身份驗證已啟用,匿名也是如此(禁用匿名會導致 403 Forbidden 並且不顯示任何內容)。
我已經嘗試啟用和禁用“核心模式身份驗證”(useKernelMode=“true”),但這似乎沒有任何區別。儘管我確實記得我們必須在不同伺服器上的另一個站點上禁用此設置才能使身份驗證正常工作(可能指向堆棧更底層的潛在問題?)。
如果它有用,從 IIS 的 applicationHost.config 中:
<security> <authentication> <anonymousAuthentication enabled="true" /> <digestAuthentication enabled="false" /> <basicAuthentication enabled="false" /> <windowsAuthentication enabled="true" useKernelMode="false"> <providers> <clear /> <add value="NTLM" /> </providers> </windowsAuthentication> </authentication> </security>任何想法可能是什麼問題?
在此先感謝您的任何建議。
更新 1
我設法找到另一個 IIS7 伺服器進行測試,我發現如果我禁用匿名訪問,一切都按預期工作。但是,即使我也禁用了匿名訪問,我仍然在原始 IIS7 伺服器上遇到問題(我現在一直禁用匿名)。所以我猜在堆棧的後面一定有一些問題。有任何想法嗎?我需要修復一些東西,因為我想它會不斷彈出並咬我們。
更新 2
如果我在問題 IIS7 框中啟用摘要式身份驗證,那麼我會遇到登錄提示對話框的挑戰,如果我提供合適的憑據,一切都會按預期工作。但是作為一個使用者已經登錄到域的內部網路應用程序,我們真的不想以這種方式挑戰他們。憑據應該透明地傳遞,因為它在第二個 IIS7 框上工作。
更新 3
一些進展…我發現如果 Web 應用程序位於根目錄而不是子站點中,則直接編輯 IIS7 的 applicationHost.config 文件以提供以下身份驗證設置允許站點按預期工作:
<authentication> <anonymousAuthentication enabled="false" /> <windowsAuthentication enabled="true"> <providers> <clear /> <add value="NTLM" /> </providers> </windowsAuthentication> <digestAuthentication enabled="false" /> </authentication>使用 IIS7 的 UI 來配置身份驗證並不能給出完全正確的結果。驗證項目要麼在病房後失去(因為我猜 IIS7 假設它們被繼承)要麼它們的設置錯誤(windowsAuthentication 似乎需要上面的提供程序配置才能正常工作)。
不幸的是,有問題的 Web 應用程序實際上是一個子應用程序,因為有一個內部版本(使用 Windows 身份驗證 > www.site.com/internal)和一個外部版本(使用表單身份驗證 > www.site.com/external)。我仍然無法讓身份驗證作為子應用程序工作。我只是得到一個“錯誤程式碼:403 Forbidden”。
在這種情況下,這是一個 Microsoft ISA Server 問題。似乎請求是通過 ISA 內部路由的 Windows Authenticated 站點,一旦 ISA 被刪除,問題就消失了。
我不太了解 ISA 以及它如何路由請求,但我認為它一定已經從請求中刪除了一些重要資訊,因為有人會配置一些規則。
作為一個旁注,以防它有助於診斷類似的設置:網路管理員告訴我,內部流量不是通過 ISA 路由的,但是在內部 ping 網站表明 ISA 實際上在起作用。