2010-02-12 242 views
46

我有一個(ASP.NET 3.5)Intranet應用程序,它被設計爲使用窗體身份驗證(以及默認的aspnet成員資格系統)。我還在另一個表中存儲了有關用戶的附加信息,該表與aspnet_users表共享其主鍵。將窗體身份驗證與Windows身份驗證混合使用

對於屬於我們域名的用戶,我將他們的域帳戶名稱存儲在次要用戶表中,並且我想自動登錄其域名帳戶名稱與存儲在表中的名稱相匹配的用戶。

我已經閱讀了可用的指南 - 它們都來自兩年前或更久,並且假設您可以在允許您提取域帳戶名的單獨登錄頁上激活Windows身份驗證。但是,從我所知道的情況來看,這在IIS7中是不可能的(整體身份驗證方法適用於所有頁面,無法選擇性地取消激活,並且兩種身份驗證方法都無法應用於同一頁面)。

有沒有辦法讓IIS通過請求用戶的Windows域帳戶名?我不需要適當的AD身份驗證,只需要域名。

回答

45

其實,你可以做到這一點。 @dr_draik遲到了一點,但是這對我來說是谷歌的結果,所以我想我會分享一些知識。

如果您處於傳統模式 - 啓用Windows和窗體身份驗證。你會收到關於不能同時進行這兩項操作的警告,但你可以ignore it。然後,您可以spelunk各地的各種屬性,如 代碼:

HttpContext.Current.Request.ServerVariables["LOGON_USER"]

和魚的用戶名離開那裏。

如果您處於集成模式 - 4021905 IIS7 Challenge-based and login redirect-based authentication cannot be used simultaneiously導致IIS 7.0 Two-Level Authentication with Forms Authentication and Windows Authentication這是一個模塊,允許您有選擇地更改不同頁面的身份驗證。

+0

非常有趣 - 謝謝你在這裏加入它,因爲我認爲這個主題有很多搜索點擊。 – 2011-05-27 09:08:58

+0

切換接受的答案,因爲顯然這個問題已經得到了不少點擊,並且這將更清晰。 – 2011-09-28 09:56:18

+0

甜,ta!我希望它有助於未來的谷歌 – 2011-09-28 15:53:55

0

我已經有東西可以嘗試 - 不知道它是否會工作。

在過去,我們已經使用Request.ServerVariables [「LOGON_USER」],但很顯然,爲了返回非空值,您需要禁用匿名訪問。

看到這篇文章:http://support.microsoft.com/default.aspx/kb/306359

它建議保持在IIS側匿名訪問,和窗體身份驗證,但否認匿名用戶,如下所示:

<authorization> <deny users = "?" /> <!-- This denies access to the Anonymous user --> <allow users ="*" /> <!-- This allows access to all users --> </authorization>

不知道這是否會工作但值得一試。

-Krip

+1

謝謝 - 給它一個嘗試,但它仍然是一個空字符串,即使使用建議的設置。 不幸的是我檢查了這篇文章,並且它不適用於IIS7。 – 2010-02-12 12:48:52

0

不幸的是,你所要做的只是不被支持。爲了讓ASP.NET知道Windows用戶名,您必須使用Windows身份驗證。

您可以設置另一個站點/虛擬目錄,只是將用戶名信息轉發到另一個頁面。但是,當非Windows身份驗證用戶嘗試登錄時會發生什麼情況?

+1

謝謝,這兩個應用程序解決方案似乎是最可行的,但我認爲我們只需要使用表單身份驗證。只有登錄纔能有單獨的應用程序,這感覺很笨拙。 – 2010-02-15 06:58:09

4

你總是可以在IIS7中設置2個獨立的應用程序。一個會啓用Windows身份驗證。另一個將是使用表單身份驗證的主要應用程序。如果用戶轉到Windows身份驗證應用程序,該頁面可以獲取他們的憑據並將其傳遞給表單身份驗證應用程序。

+1

謝謝,這兩個應用程序解決方案似乎是最可行的,但我認爲我們只需要使用表單身份驗證。只有登錄纔能有單獨的應用程序,這感覺很笨拙。 – 2010-02-15 06:56:50

4

(多爲信息的完整性真的)

我問了.NET安全的人這個問題在一次會議而回。他的回答是,技術上可能,但他從來沒有看到它完成(並讓他知道,如果我做到了,它的工作!)。

他建議可以做的方式是製作自己的ISAPI篩選器並將其安裝到IIS中。 ISAPI篩選器將攔截這些請求,並基本完成IIS在使用集成身份驗證時執行的任務,但如果不存在,則會退回到使用表單。這涉及到過濾器中一些複雜的挑戰/響應邏輯。這是爲了IIS6,所以在IIS7中可能會有所不同。

雖然這可能是技術上是可行的,因爲那感覺就像一個黑客位的我不建議這條路線,滾動自己的安全是從來沒有一個好主意(除非你真的知道你是做)。

+1

感謝您的輸入 - 這已經不再可能(或實際上不再可能),但有點令人煩惱,但我認爲這是進步的代價。 – 2010-02-16 14:12:17

+0

感謝您分享此信息!我同意你所說的不是推出我們自己的安全特性,除非我們確信 – 2015-10-13 13:36:37

1

有很多關於混合authenticaton的文章,通過設置配置來使用允許匿名訪問應用程序的表單。其次,應該創建一個用於集成身份驗證的頁面,並將IIS設置設置爲拒絕匿名並使用集成身份驗證。通過檢查請求的ServerVariables集合的「Logon_User」變量,你會發現魔術。最後,爲了集成身份驗證來悄悄登錄用戶,它必須擁有較短的託管名稱。所以如果你的表單身份驗證片通過FQDN暴露在互聯網上,應該有一些重定向到短主機頁面。我認爲只需要一個具有2個虛擬目錄的IIS應用程序就可以實現。

+1

據我所知,這個解決方案在IIS6上工作,但不在IIS7中。這是因爲在IIS6中,您可以爲每個文件夾(甚至每個文件)分配auth模式,而在IIS7上,auth設置對於整個應用程序是全局的。 – pomarc 2010-12-21 13:39:26

1

我找到了一個不使用特殊插件的解決方案。這很棘手,涉及到從這裏引用的所有頁面中鏈接元素。 我發佈了它:http://low-bandwidth.blogspot.com.au/2014/11/iis7-mixed-windows-and-forms.html

實質上,窗體,窗口和匿名驗證必須啓用。 登錄屏幕應該基於表單,並且包含一個觸發Windows登錄的按鈕,該按鈕會發出HTTP 401響應質詢,如果成功創建基於表單的登錄票據。

這些問題相當複雜,而且這篇文章詳細介紹了原理和解決方案。

相關問題