2011-01-05 106 views
3

我有一個運行在託管環境中的服務器應用程序,但在客戶端的本地網絡(在NAT後面;這與此無關)的機制中創建打印作業。如何唯一標識ASP.NET應用程序中的客戶機?

爲了將打印作業發送到連接到工作站的打印機,我需要識別工作站。用戶在工作站之間移動,所以我不能將用戶與工作站/打印機永久關聯。簡單的解決方案是要求用戶識別他正在登錄的計算機,例如通過從列表中選擇,但這是一個不便之處並且受到用戶錯誤的影響。

選項我已經消除:

  • 主機頭變量(沒有可識別的發送)
  • 餅乾,支持用戶選擇的。這有點解決了用戶錯誤的可能性,但不是真的。
  • HTML5 DOM存儲 - 不是由客戶端瀏覽器

任何其他的想法支持?

編輯:我可以將這個特殊功能(創建一個打印工作)puttnig到胖客戶端應用程序的選項。那麼當然可以配置應用程序,問題就會消失。但用戶體驗將會因瀏覽器和Windows應用程序之間的切換而受到影響。

+0

而且您不能設置響應類型和響應。將這些位寫入()到客戶端,以便它們可以打印到他們想要的任何打印機上?它的每種其他Web應用程序(無需專用打印服務器)如​​何實現它。 – StingyJack 2011-01-05 21:22:54

+0

@SingyJack:編號 – cdonner 2011-01-05 21:41:56

+0

已經發布了一些方法來創建客戶端機器的「指紋」。網上有關於Canvas Fingerprinting的一些重要討論 - 例如搜索「Client Fingerprinting」和「Canvas Fingerprinting」等。 – 2015-02-18 16:47:44

回答

7

我不會討論你的奇怪的的情況,只是回答你的問題:如何識別一臺機器?

那麼,目前還沒有HTTP協議的解決方案。所有機器都在NAT後面共享相同的IP。你無法獲得MAC地址。您無法獲得硬件標識符。您不能確定所有機器發送不同的標頭到服務器(即所有不同的瀏覽器/版本)。

您可能依賴於Cookie。嘗試創建某種形式的機器驗證或更高版本,機器識別頁面,從每臺機器瀏覽一次,告訴服務器是哪臺打印機在該機器上使用,,然後在該機器上設置永久Cookie

只要餅乾不會被刪除(也許你可以隨時更新餅乾,你永遠不會知道......)你有一個簡單的機制。

這是最好的,我可以建議:(

+0

這是我自己想出的最佳解決方案,很高興聽到我沒有錯過任何其他事情。由於機器操作員擁有單獨的AD帳戶,因此每個用戶需要訪問一次「設置Cookie」頁面,這使得這一點不太吸引人。 – cdonner 2011-01-05 21:38:38

+0

不是每個用戶一次:每臺機器一次。 Cookie被綁定到瀏覽器,而不是用戶或他的會話。只需確保沒有人清除cookie – 2011-01-05 21:43:31

+1

由於機器操作員使用單獨的網絡帳戶登錄工作站,因此不幸的是,他們不共享cookie。 – cdonner 2011-01-05 21:55:39

0

如果你查詢servervariables時,他們提出請求,你會有Request.ServerVariables [「REMOTE_ADDR」];如果應用程序是內部/內部網絡,這可能是內部IP。還有REMOTE_HOST。有時候這些會被代理/防火牆/ nat過濾掉,但希望不會出現在你的情況中。

您也可以在HTTPRequest對象(如Request.UserHostAddress)上調用這些對象。您可能需要通過當前上下文HTTPContext.Current.Request.UserHostAddress獲取它。

如果你不能得到,那麼只需將文檔,數據,文件返回到打印請求,並通過Response.BinaryWrite()設置他們正在訪問的文件的內容類型來選擇打印機。

所有servervariables這裏列出了IIS,因爲你正在使用ASP.NET:http://msdn.microsoft.com/en-us/library/ms524602(v=vs.90).aspx

另一種可能性是通過電子郵件發送給用戶,如果它是一個長期運行的報告,還是讓他們有一個日誌訪問文檔在自己打印。

+0

嗯......這個問題讓我覺得服務器在NAT外面是**,因爲他不想提及NAT遍歷打印(端口轉發?UPNP?我不在乎)(可能是複雜的)機制 – 2011-01-05 21:29:13

+0

當你想要推送而不是客戶端時,問題就變成了。 NAT可能不好。 UPnP,udp nat punching,轉發,各種各樣的東西發揮作用。 – 2011-01-05 21:32:18

+0

REMOTE_ADDR是外部IP,REMOTE_USER是空的。我提到我已經消除了主機頭變量作爲解決方案。 – cdonner 2011-01-05 21:35:17

0

如果REMOTE_ADDR實際工作爲標榜,你有沒有嘗試過的兄弟,REMOTE_HOST?如果主機不工作,但ADDR的話,那麼

RemoteHostOughta = GetHostEntry(Request.ServerVariables("REMOTE_ADDR")).HostName 

不幸的是,有一些我不知道的設置,這樣當我讀取REMOTE_ADDR時,我的IIS獲取服務器IP(而不是路由器!)而不是遠程設備。