36

我已經盡力搜索網絡之前問這個問題。我在stackoverflow上看到了類似的問題,但是,現在很長一段時間都沒有得到滿意的回答。這是再次試圖讓這個經常性問題得到解答。ASP.NET身份+ Windows身份驗證(混合模式 - 窗體+ Windows)

的問題

如何建立一個ASP.NET MVC 5的網站,使用「Windows驗證」爲Intranet用戶和「窗體身份驗證」的網民?我們希望使用ASP.NET Identity完成此操作。此外,我們不希望使用Active Directory組進行授權。對於Intranet用戶,我們希望使用Active Directory對其進行身份驗證,然後回退到ASP.NET身份以管理其角色和其他個人資料數據。

如果我們不要求最終用戶選擇auth方法,那將會很好。 Web應用程序應該無縫地登錄Intranet用戶。他們甚至不應該知道有一個登錄屏幕。同樣,不應要求互聯網用戶輸入他們的域名憑證。他們應該立即看到基於表單的登錄屏幕。

有沒有解決這個問題的建議方法?或者,如果以下任何一種解決方案是正確的,你可以評論嗎

http://world.episerver.com/blogs/Dan-Matthews/Dates/2014/8/Mixing-Forms-and-Windows-Authentication/

https://github.com/MohammadYounes/MVC5-MixedAuth

http://mvolo.com/iis-70-twolevel-authentication-with-forms-authentication-and-windows-authentication/

FYI這是2004年的文章,現在可能沒有幫助: https://msdn.microsoft.com/en-us/library/ms972958.aspx

+0

您是否設法實現這一目標?我正在尋找類似的解決方案,但隨着Active Directory for Azure的提供解決方案的複雜性也增加了。 – 2016-08-12 09:22:11

+0

Ravi,如果是的話,您是否能夠達成解決方案,請與我們分享解決方案。 – Aji 2016-11-30 11:41:01

+0

還沒有,我會的時候會發布。 – 2016-11-30 15:54:14

回答

4

一種可能的方式可以在IIS中創建兩個網站,但具有相同的目標文件夾,網站的來源所在的位置。例如,第一個站點用於啓用Windows身份驗證模式並綁定到80端口的內部用戶,而第二個站點則用於啓用了匿名模式並綁定到8080端口的外部用戶。然後,在防火牆上,您必須配置NAT,即來自本地網絡或VPN內的所有請求將被重定向到端口80上的本地IIS服務器,並且來自Internet的所有請求將被重定向到IIS服務器的8080端口。

+0

我想這會有所幫助。但是,這也會導致維護另一個站點的額外工作。它也會改變網站的網址。任何想法,你如何連接Windows身份驗證與角色定義與asp.net身份並存儲在數據庫中? – 2015-02-08 21:11:19

+0

沒有額外的努力來維護網站。您只需在IIS中創建兩個指向磁盤上相同站點的鏈接。 URL爲1:所有本地網絡都位於防火牆之後,只有防火牆具有綁定域的外部IP地址。因此,所有用戶的域名(URL)保持不變,所有邏輯都隱藏在防火牆之後。 – rba 2015-02-09 06:22:30

+1

但是,您不能以局域網中的外部非AD用戶身份登錄? – Bigwave 2015-02-18 10:36:39

1

你想從一個URL處理表單和AD認證嗎?我已經使用思想(基於聲明的身份驗證)作爲WIF的框架並編組各種形式的身份驗證。但是,要處理來自一個URL的情況,我必須在登錄時處理一些將用戶關聯到AD或基於表單的邏輯。在最近的一個項目中,當我們創建用戶帳戶(它與Forms Auth的AD關聯)時,這是在用戶管理中處理的。然後,當用戶登錄時,他們會將AD域名作爲登錄的一部分。有很多方法可以實現,這只是我用過的一個。一個例子,而不是要求的領域,只是使用的用戶名,然後檢查上的用戶名AD或基於表單的標誌,然後處理驗證相應

編輯 只是一個在重新閱讀你的問題的更新。互聯網用戶和內網用戶是否一樣?如果是這樣的話,你需要在整個板子上進行基於表單的認證,並管理獨立於AD的產品DB中的用戶。如果他們是相同的,那麼他們可以將域名登錄爲用戶名。如果你只想依靠AD。

+1

不,內聯網和互聯網用戶不同。我們希望爲Intranet用戶使用Windows身份驗證,因爲他們都使用公司筆記本電腦\ PC訪問網站。我們已經知道他們是誰,因爲他們使用他們的Windows帳戶登錄到他們的計算機。然後讓他們再次登錄是沒有意義的。因此Windows驗證。互聯網用戶是外部供應商等,所以他們必須提供他們的用戶名和密碼才能登錄。 – 2015-02-09 05:48:46

4

這個術語是混合模式認證。我已經多次這樣做了。你只需要調整你的主站點。這是我如何做到的。

保持您的主要MVC網站,但作爲匿名與Windows認證下運行。

內部網站

創建一個重定向URL站點:設置這個網站爲窗口驗證,因此您可以從Active Directory拉用戶ID。給你的用戶這個URL和/或使它成爲他們在你的Intranet上點擊的鏈接。然後這個站點調用您的MVC站點並傳遞用戶憑據(登錄ID)。

a。這可以通過URL上的加密字符串或cookie中的加密值來完成。您也可以使用過期日期/時間值加密。

b。 (從表單身份驗證發言)使用該用戶標識創建表單身份驗證票證。運行您擁有的任何其他登錄邏輯。完成。

外部網站 - 無需更改。讓用戶按原樣登錄。

+0

但是你有兩個網址?那麼只有那些只有在辦公室的技術性較差的用戶才需要記住兩個網址,以及何時使用它們? – Bigwave 2015-02-18 10:10:56

+0

有兩個網址,但是如果你看看微軟的文檔如何破解一個網站以使其與Windows驗證和匿名一起工作,他們將展示如何去做,但出於安全原因提出反對意見。你有一個內聯網嗎?把鏈接放在那裏。 – 2015-02-19 00:28:06

+1

@Bigwave有多種方法可以在沒有多個URL的情況下完成此建議。您可以配置您的DNS以向內部網用戶提供內部IP,例如www.example.com指向Intranet上的10.x.x.x,但指向外部的公用IP。然後在相同的URL下將小型Windows Auth應用設置爲子站點,併爲內部用戶重定向匿名用戶。或者,如果您使用的是負載平衡器,請爲外部用戶添加特定的「X-Forwarded-For」標題並查找該標題。也許不是最乾淨的解決方案,但有一點工作可以使其儘可能無縫。 – 2015-09-09 15:44:44

0

爲什麼不把你的網站代碼放在服務器上,robocopy到兩個單獨的網站,並通過配置web.config來處理身份驗證的更改。 (其中一個設置爲匿名,另一個設置爲Windows身份驗證。)

它不像其他方法那樣時髦,但它相對無痛。有兩個站點,但內容(web.config除外)是相同的。

1

我做的這個概念證明前一段時間,在我以前的工作,所以細節是朦朧的,我沒有任何的代碼來引用...

的要求是:

  • 同一網址內(LAN)和外部(互聯網)接入
  • 兩種類型的用戶,人們對域和外部(非廣告)的用戶
  • Windows身份驗證域用戶的內部和外部
  • 使用的iPad時(沒有窗戶AUTH)進入域登錄細節的能力

解決方案中的核心思想我想出的是,我們使用Active Directory組策略來添加自定義字符串,HTTP請求頭用戶代理的內容並不重要,實際上我們使用了一串長長的隨機字符。

https://technet.microsoft.com/en-us/library/cc770379.aspx

然後換了現場檢查,這樣做的登陸頁面,如果發現重定向到一個虛擬目錄,與Windows驗證,即檢查他們的AD帳戶,填充ASP.NET驗證令牌,然後重定向他們到他們的主頁。

如果自定義標題不存在,那麼它只顯示正常的登錄表單。

唯一的另一件事是將AD電子郵件/密碼檢查添加到正常的登錄表單,以便如果域用戶從非Windows設備(iPad)訪問該網站,則可以使用其正常的登錄詳細信息。

5

IIS配置
啓用整個網站和IIS匿名身份驗證狀態Windows認證爲根目錄下的文件夾的一些(例如,/ WindowsLogin)。在此文件夾中放置aspx文件(用於WebForms項目)或創建ApiController(用於MVC項目)。

站點設置
在登錄頁面添加按鈕「與Windows/ActiveDirectory的賬號登錄」(類似的方式,因爲它是常見的做法是添加按鈕與Twitter,Facebook和Gmail等登錄)。當用戶按下此按鈕時,它們將被重定向到/ WindowsLogin文件夾中的需要Windows身份驗證的頁面或控制器。如果網站使用某些單一登錄功能,請在該頁面或控制器中找到它,而在其他情況下,請在此處爲Windows用戶保存會話。如果用戶訪問了該頁面或控制器,則他們已經被Windows用戶認證。