2011-01-05 102 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(而不是路由器!)而不是远程设备。