假设我们有一个Web应用程序,它将是
对此Web应用程序实施许可的最佳方法是什么,实质上可以轻松打开/关闭客户端的访问权限。我在想这个流程是这样的:
客户端本地安装--->使用中央服务器授权--->允许/ 拒绝访问
此外,我希望能够确保我们可以提供免费试用,基本上打开和关闭应用程序的某些功能。我们还必须考虑如果我们“停业”会发生什么。
答案 0 :(得分:4)
你有正确的想法,
使用您的中央服务器(这可以是您的托管解决方案),
如果您在托管(外部)解决方案上构建许可证检查程序,则只需添加需要许可证密钥加密帖子的Web请求, E.G
请求{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个不同的代码库
备注:强> 您不必通过公司发送您可以使用数据库的SHA1功能搜索数据库并进行直接查找检查以获得过期和填充
安全数据 如果您实现一个安全的应用程序,因为它保存了由于某种原因无法公开的数据以减少黑客攻击,使许可证系统位于不同的端口和服务器设置允许它只在外部呼叫上建立该端口上的连接一个linux路由盒就是理想的,因为iptables可以很简单地做到这一点我不确定在windows上设置是多么容易
<强>更新强> 保护许可证无效
您可以实现的另一个功能是防止人们“归零”您的许可证并且不需要任何本地更改,许可证服务器会验证主机名,因此当首次使用许可证密钥时,它会将主机名保存到数据库针对许可证密钥如果另一个请求来自不同的主机名称告诉他们必须联系您重新启用许可证,因为主机名已更改大多数公司应该运行静态IP地址,因此他们将始终拥有静态主机名称,即使它有ISP主机名
这仍然不能阻止有经验的人,他们可以绕过所有他们需要的循环回技术以防止你的应用程序与你的服务器通话然后他们将不得不在那里设置一个虚拟服务器回路以回应虚假信息< / p>
额外英里
您可以通过将许可证系统设置为C#库来防止这种情况,并且应用程序下载新版本卸载现有程序集并加载到新的DLL程序集中,您必须确保不要更改公共方法的名称然后,您可以在不破坏服务器或完整客户端更新的情况下添加更多安全性,此时您还可以在通信上使用某种形式的AES或基于证书的加密,并使用嵌入式资源将证书编译到DLL中。
通过上述内容,您甚至可以更好地为每个许可证密钥创建一个新证书,这应该使“归零”非常困难*
正如另一个不是*这将需要服务器编译DLL我强烈建议你不要在托管服务器上这样做,因为它将使用大量的内存和CPU电源来最小化这种使用MSBuild和保留所有编译数据,所以你唯一要改变的是证书应该意味着保留.pdb文件并且应该编译得更快