4

假设我们有一个 Web 应用程序,它将是

  • 可通过 Internet 访问的托管解决方案
  • 能够在本地安装以用作“Intranet”应用程序

对此 Web 应用程序强制执行许可的最佳方式是什么,基本上可以轻松打开/关闭客户端的访问权限。我在想流程会是这样的:

客户端安装在本地 ---> 使用中央服务器授权 ---> 允许/拒绝访问

此外,我希望能够确保我们可以提供免费试用,本质上是打开和关闭应用程序的某些功能。我们还必须考虑如果我们“倒闭”会发生什么。

4

1 回答 1

6

你有正确的想法,

使用您的中央服务器(这可以是您的托管解决方案),

如果您在托管(外部)解决方案上构建许可证检查器,您只需添加一个需要许可证密钥加密发布的 Web 请求,例如

对 {domain} 的请求

https://{domain}.{tdl}/licenceValid/internal

发布查询字符串

licenceCrypt={licenceKey(though SHA1)}&companyId={company_id}

做你的检查然后返回一个字符串 JSON,一旦你有一个纯文本版本,你就可以引入密码学,这样你就不会通过互联网发送纯文本

Succsess : {'status':'OK','expire':'20/07/2012 00:00:00', 'check':'18/07/2012 00:00:00'}
Fail     : {'status':'FAIL','Message':'Licence has expired'}

然后使用此信息缓存该结果。然后,您可以从文件中加载此信息并检查日期是否小于当前日期。但是,如果失败并且许可证尚未过期,请再次下载,请继续让他们使用应用程序,但会显示一条通知,告诉他们许可证验证有错误。如果许可证从缓存日期块过期,则许可证将在 {date} 过期,阻止应用程序告诉他们他们需要检查服务器与 Internet 的连接,如果这不起作用,请致电您。

如果所有其他方法都失败了,那么您可以使用带有小应用程序的笔式驱动器弹出,以使用新的许可证详细信息更新缓存文件,以便他们可以再次使用该软件,现在对于缓存,我建议您使用2 路加密 EG base64 但是我会推荐一个更强的

然后,您的托管解决方案可以在类中加载并检查所请求版本的许可证,而无需任何帖子,或者如果您想分离托管应用程序和许可证服务器,您可以对本地副本实施相同的检查,这样您就没有2个不同的代码库

注意: 您不必通过 companyId 发送,您可以使用数据库的 SHA1 函数搜索您的数据库并进行直接查找检查以获取过期和东西

安全数据: 如果您实施一个安全应用程序,因为它包含由于某种原因无法公开的数据以减少黑客攻击,请在不同的端口上设置许可证系统,并在服务器设置中允许它仅在该端口上从外部调用首先一个 linux 路由框将是理想的,因为 iptables 可以很简单地做到这一点我不确定在 Windows 上设置有多容易

更新: 防止许可证无效

您可以实施以防止人们“取消”您的许可证并且不需要任何本地更改的另一个功能是在许可证服务器上验证主机名,因此当第一次使用许可证密钥时,它会将主机名保存到数据库中许可证密钥,如果另一个请求来自不同的主机名,请告诉他们他们必须联系您重新启用许可证,因为那里的主机名已更改大多数公司应该运行静态 IP 地址,因此他们将始终拥有静态主机名,即使它有 ISP 主机名

这仍然不能阻止有经验的人,他们可以绕过所有他们需要的环回黑客,以防止您的应用程序与您的服务器通信,然后他们将不得不在那里设置一个虚拟服务器环回以响应虚假信息

额外一英里

您可以通过使许可证系统成为 C# 库来防止这种情况,并且应用程序下载新版本卸载现有程序集并加载新的 DLL 程序集,您只需确保不更改公共方法的名称,然后您就可以在不破坏服务器或完整客户端更新的情况下添加更多安全性,您还可以在通信中使用某种形式的 AES 或基于证书的加密,并使用嵌入式资源将证书编译到 DLL 中。

有了上述内容,您甚至可以做得更好,为每个许可证密钥制作一个新证书,这应该会使“无效”变得非常困难*

就像另一个不是 * 这将需要服务器编译 DLL 我强烈建议您不要在托管服务器上执行此操作,因为它将使用大量内存和 CPU 功率来最小化此使用 MSBuild 并保留所有编译数据,因此您唯一更改的是证书应该意味着它保留 .pdb 文件并且应该更快地编译

于 2012-07-16T15:15:12.367 回答