强制执行本地托管Web应用程序的许可证

Enforcing Licenses from Locally Hosted Web Applications

本文关键字:应用程序 许可证 Web 强制执行      更新时间:2023-11-03

假设我们有一个web应用程序,它将同时是

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

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

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

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

你有正确的想法,

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

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

请求{域}

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}到期。如果许可证从缓存日期到期,则阻止应用程序告诉他们需要检查服务器是否连接到互联网,如果不起作用,请致电您。

如果所有其他操作都失败了,你可以用一个笔驱动器弹出,上面有一个小应用程序,用新的许可证详细信息更新缓存文件,这样他们就可以再次使用该软件,现在对于缓存,我建议你使用双向加密E.G base64,但我建议使用一个更强的

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

注意:你不必发送companyId,你只需使用数据库的SHA1功能搜索数据库,并进行直接查找检查即可获得过期和填充的

安全数据:如果你实现了一个安全的应用程序,它保存着由于某种原因无法暴露的数据,以减少黑客攻击,那么让许可证系统在另一个端口上,并且在服务器设置中允许它只通过外部调用在该端口上建立连接,那么linux路由盒将是理想的选择,因为iptables可以很简单地做到这一点。我不确定在windows上设置有多容易

更新:确保许可证无效

您可以实现的另一个功能是在许可证服务器上验证主机名,以防止人们"取消"您的许可证,并且不需要任何本地更改。因此,当第一次使用许可证密钥时,它会根据许可证密钥将主机名保存到数据库中主机名已经更改大多数公司都应该运行一个静态IP地址,这样他们就永远有一个静态主机名,即使它有ISP主机名

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

额外里程

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

有了以上内容,你甚至可以做得更好,为每个许可证密钥制作一个新的证书,这将使"作废"变得极其困难*

正如另一个不适用于*的问题一样,这将需要服务器编译DLL,我强烈建议您不要在托管服务器上这样做,因为它将使用大量内存和CPU功率来最大限度地减少这种情况。使用MSBuild并保留所有编译数据,所以您唯一更改的是证书,这意味着它将保留.pdb文件,并应更快地编译