2008-09-05 50 views
1

我有一個Web應用程序,應該對內部用戶的行爲不同於外部用戶。 Web應用程序可通過Internet訪問,因此顯然也適用於內部用戶。如何獲取瀏覽器IP或主機名?

所有用戶都是匿名的,沒有通過身份驗證,但頁面對內部用戶的呈現方式應該與外部呈現不同。我在我的代碼中使用的是Request.UserHostName,然後是Dns.GetHostEntry。然後將結果與我的web.config中的設置進行比較(該設置包含類似*.mydomain.local的設置)。如果比較給出了肯定的結果,那麼我呈現內部用戶應該看到的HTML,否則我呈現外部用戶應該看到的HTML。

但是,我的問題是,我並不總是從Request.UserHostName得到預期值。在開發網站上,我得到運行瀏覽器的機器的IP-number(?),但在客戶站點上,我沒有得到用戶機器的IP-number,我得到了其他IP-number。瀏覽器沒有設置任何代理或類似的東西。

我應該使用Request.UserHostName以外的東西嗎?

回答

3

我推薦使用IP地址。我現在正在處理完全相同的情況,建立一個認證系統,Epso和Robin M所描述的條件正是發生的情況。外部用戶訪問該站點會給我他們的實際IP地址,而所有內部用戶將網關機器(路由器)的IP提供給Web服務器所在的專用子網。

要處理它,我只是檢查一個IP。如果我得到網關的IP,我提供內部訪問。如果我得到其他東西,他們會得到外部需要額外身份驗證的東西。在你的,它只是意味着一個不同的界面。

0

可能有防火牆正在執行某種NAT,以使內部客戶端能夠使用外部DNS名稱到達服務器。

您在客戶網站上獲得的IP號碼是否與外部客戶服務器ip相同?在這種情況下,您可以爲該IP地址進行硬編碼。該防火牆後面的所有內部計算機似乎都必須具有相同的IP地址,並且可以將它們歸類爲「內部」。

0

它看起來像你正在返回一個面向公衆的IP地址。讓用戶去http://www.myipaddress.com。如果這與返回到您的軟件的IP地址相同,那麼這肯定是這種情況。

我可以看到解決此問題的唯一解決方案是讓他們通過VPN連接到持有asp.net應用程序的計算機,或者使用其他類型的身份驗證。後者可能是最好的選擇。

2

嘗試Request.UserHostAddress,它返回客戶端的IP地址。假設你的內部網絡使用爲局域網保留的IP地址,檢查IP是內部還是外部應該相對簡單。

0

聽起來好像用戶和客戶站點上的服務器之間存在代理(它不需要在瀏覽器中配置)。根據您的網絡配置,它可能是內部或外部代理。

我會避免使用UserHostName來進行有效的身份驗證,因爲它是由瀏覽器在請求時呈現並且很容易被欺騙。 IP地址會更有效,因爲很難在TCP/IP連接中欺騙IP地址(並保持連接)。它仍然是弱認證,但在這種情況下可能就足夠了。

即使您使用的是IP地址,如果客戶端和服務器之間有NAT代理,您可能不得不接受通過該代理進行的任何操作都是可信的(我假設外部/不可信客戶端不會通過該代理)。

如果這是不可接受的,您可以回到其他驗證方法。您可能會考慮使用永久性cookie或客戶端證書,而不是要求登錄或VPN連接,而只需將其提供給內部客戶端,但您需要某種方式將這些內容交付給客戶端。您當然可以根據一次性登錄提供永久性Cookie。Cookie可以以類似的方式欺騙​​,因爲UserHostName可以有更好的機會創建比域名更不易猜測的cookie值。

相關問題