【问题标题】:Limiting number of computers from which users can access ASP.NET website?限制用户可以访问 ASP.NET 网站的计算机数量?
【发布时间】:2009-04-23 20:51:10
【问题描述】:

我正在构建一个 ASP.NET 应用程序。其中一项要求是限制用户可以访问站点内容的不同计算机的数量(例如 5 台计算机)。它不一定是完美的,如果没有 IT 知识的普通用户将无法省略检查 - 解决方案将是 K。

我正在考虑一种获取用户机器指纹的方法(例如:MAC 和计算机名称的组合)。当然,用户将被告知检查他们的 MAC。 但是,这很难做到,因为 HTTP 协议是无状态的。一种解决方案是使用 ActiveX。但它仅限于 Windows 系统,并且很容易通过安全检查(只需禁用 ActiveX,据我所知默认情况下禁用)。

我在谷歌上搜索过,这是一个很常见的问题,但除了使用 ActiveX 之外没有其他解决方案。有没有人遇到过这种问题,找到了好的解决方法?

用户可以在不同的网络中。这将是一个外联网应用程序,因此无法检查 IP(路由器和动态 IP)。

编辑:我这样做是为了避免购买会员资格,然后将帐户数据分享给您的所有朋友。

【问题讨论】:

  • 为什么要这样做?你想达到什么目的?为什么必须将用户限制在您无法控制的特定计算机上?
  • 这是个好问题。这一要求的意义是避免用户在应用程序中注册、支付会员费用以及将帐户凭据提供给其他人。
  • 但如果他们付费,你为什么关心谁使用它?您是否担心他们会“过多”使用它?那我建议你找一个不同的“太多”定义。
  • 我建议您更新问题以表明要求是限制人数而不是计算机数量。
  • 我还建议,快乐的用户与其他人分享他或她的帐户是您无法购买的那种广告。喜欢它的人会注册自己的会员资格,特别是如果帐户有一些个性化方面。

标签: asp.net content-management settings


【解决方案1】:

根据您的评论

这个要求的意义是避免用户在应用程序中注册、支付会员费用以及将帐户凭据提供给其他人。

要么像RSA hardware authenticators那样昂贵且高度安全

-或-

您改变了您的业务模式,使共享凭证变得没有吸引力。例如由于成本 - 我不分享我的苹果或亚马逊信誉,因为我不想为他们的购买付款。另一个是拥有一个用户社区。没有人分享他们的 flickr 帐户,因为这些照片在艺术上是他们的,而且他们不希望任何人为了几美元而捣乱他们的东西。不鼓励分享,因为它是一个社区,而不仅仅是一个存储库。

但这些事情都不会阻止用户分享,但我确信这种情况发生的次数要少得多。

否则,您会将自己限制在(尝试)被动监控滥用行为的机制中。并发下载过多、并发访问过多等。如果您的用户违反了您协议中的 t 和 c,那么您将暂停他们的帐户。但是你必须有非常明显的违规者,因为很容易出错。如果可以的话,这是一个应该避免的模式,因为你总是会追赶,总会有人欺骗你。

如果需要购买 RSA 设备来访问网站,没有人会注册该网站。这不是一个可行的消费者解决方案。


(原始答案) 我认为您要查看的是使用客户端证书身份验证。本质上,您的用户会在他们的计算机上安装个人客户端证书,以便当他们连接到您的服务器时,您的服务器可以验证该计算机。

我不会告诉你这很容易,因为它看起来不像。您可能需要设置自己的证书服务器并快速搜索它,它都不漂亮。

也许,视操作系统而定,其中有一项功能,您可以创建特定于机器的证书或无法导出的证书。

这类事情通常用于服务器之间的安全连接,而不是通常用于客户端所需的内容。这将是帮助台的噩梦。

wiki Transport Layer Security 或 windowssecurity.com Using Client Certificate Authentication with IIS 6.0 Web Sites 或 msdn Building Secure ASP.NET Applications: Authentication, Authorization, and Secure Communication

你也可以走RSA hardware authenticators的路线

【讨论】:

  • 我认为这是最好的主意。为用户定制应用程序,使他们不想共享他们的帐户。会发生一些欺诈行为,但普通用户不会有兴趣分享他的帐户数据。
【解决方案2】:

使用(跟踪)cookies?即使这将基于每个浏览器而不是基于每个机器,当然还需要用户启用持久性 cookie,但这可能就足够了吗?检查 cookie 是否存在并且不应该过期,如果它存在,一切都很好而且花花公子 - 如果没有,添加它并在你的后端跟踪它......

通过 IP、网络或任何其他与网络相关的标准来屏蔽访问,虽然当然有其自身的问题,就像大多数没有固定 IP 的用户一样,或者如果是这样,通过 NAT 的恐怖与许多其他用户共享它,应该最有可能由发布防火墙完成,而不是应用程序本身。

通过一个简单的网站从某人的计算机上获取指纹或任何识别信息几乎是不可能的(希望如此),而是需要用户安装本地应用程序或插件。

编辑:关于原因的新添加信息清楚地表明,任何此类解决方案都会令人讨厌,并且需要额外的开发和维护成本。完全绕过这个限制的答案似乎是最好的。

【讨论】:

  • +1 可能是最好的主意,但似乎即使是不成熟的用户也知道如何清除浏览器信息。
  • 是的,但是如果他们清除它们,他们会阻止自己访问该站点 - 而不是相反...您当然需要告知用户这一点 :)
【解决方案3】:

如果限制在某个时间范围内就足够了——也就是说,用户在一天、一周或一个月内只能使用五台不同的计算机,您可以随时检查 IP 地址。每次用户尝试访问您的网站时,您可以使用以下算法来查看您是否应该允许访问:

1) 检查此用户帐户之前使用的 IP 地址。是否有少于 5 个唯一 IP?是 => 3. 否 => 2.

2) 已经存储了五个或更多 IP。其中至少有一个至少一天/一周/一个月大吗?是 => 3. 否 => 4.

3) 没关系 - 存储的 IP 少于五个,或者至少一个太旧。删除任何太旧的,存储新的并进行身份验证。 => 5.

4) 不行 - 五个或更多 IP 已经在您的数据库中,而且还没有一个过期。不进行身份验证。 => 5

5) 结束

【讨论】:

  • 是的,这将是一个很好的解决方案,但用户可以拥有动态 IP,而且会经常更改。
  • 这就是为什么只有当你把自己限制在一个时间跨度的时候它才会起作用。您假设动态 IP 客户端多久收到一次新 IP 地址?如果您的时间跨度较短,则旧 IP 将在更改后标记为“旧”。
  • 嗯,这是一个相当合理的解决方案。
  • 同一家中的五台电脑使用同一个路由器看起来就像一台电脑。
  • 他们会,但亚当没有具体说明为什么他想限制每个帐户访问五台计算机。如果同一家庭中的两台计算机仍应被视为两台不同的机器,那么我的解决方案不是解决方案,因为正如您所说,通过同一个路由器,网络应用程序将无法区分。但我认为没有理由认为这些机器不同 - 如果用户可以访问所有这些机器,那么他/她选择使用哪一台可能是非常随机的。
【解决方案4】:

这适用于许可方案吗?如果是这样,这是我自互联网问世以来听到的最愚蠢的许可证之一。

这种许可证过去在桌面应用程序环境中有意义,但在基于 Web 的应用程序中没有意义。您的应用程序可能是这些用户使用的唯一具有这种行为方式的应用程序。这对你来说看起来不太好。

【讨论】:

  • 我被要求实现这种功能。问题不在于这种解决方案的意义,而是有可能做到,以及如何做到。
  • 如果不了解需求试图达到的目标,你就不可能实现它。
【解决方案5】:

除非我们谈论的是限制所有在同一个 LAN 上的用户,否则为什么不能只跟踪用户的 IP 地址,如果他们来自不在他们“列表”中的 IP 地址,那么你可以将他们转向离开而不进行身份验证?

【讨论】:

  • 如果用户的 IP 地址发生变化,这将是一个问题 - 这很常见,尤其是在他们使用拨号时。
【解决方案6】:
  • 使用带有 MAC 过滤/IP 过滤的防火墙
  • 应用程序中的 IP 白名单
  • Membership Provider 中“登录”用户的阈值

场景是什么,它是面向公众的网站还是您要在私有 LAN 上内部托管的东西

【讨论】:

    【解决方案7】:

    是否只有 5 台特定的计算机?或者不超过 5 台同时运行的计算机?这不是一个完美的解决方案,但您可以分别在会话开始/结束时增加/减少计数器。

    编辑:好的,在这种情况下,我可能会采用基于 cookie 的方法(同样不完美)。当 PC 连接时,在客户端计算机上存入一个 cookie,并在服务器上记录该 cookie。当 #6 尝试连接时,阻止 cookie 并拒绝连接。

    【讨论】:

    • 不是同时使用计算机,但可以说一个月内不超过五台不同的计算机。
    【解决方案8】:

    我认为您应该考虑使用 WCF Web 服务和具有授权的自定义 WinForms/WPF 客户端。

    【讨论】:

    • 它必须是一个 ASP.NET 应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多