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

C# 从本地托管的Web应用程序强制执行许可证,c#,javascript,.net,web-applications,licensing,C#,Javascript,.net,Web Applications,Licensing,假设我们有一个web应用程序,它将同时是 可通过Internet访问的托管解决方案 能够在本地安装,用作“Intranet”应用程序 为该web应用程序强制执行许可的最佳方式是什么,本质上是使客户端的访问打开/关闭变得容易。我在想,流程应该是这样的: 客户端在本地安装-->使用中央服务器授权-->允许/ 拒绝访问 此外,我希望能够确保我们能够提供免费试用,基本上打开和关闭应用程序的某些功能。我们还必须考虑如果我们“走出去”会发生什么。 < P>你有正确的想法, 使用您的中央服务器(这可以是您

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

  • 可通过Internet访问的托管解决方案
  • 能够在本地安装,用作“Intranet”应用程序
为该web应用程序强制执行许可的最佳方式是什么,本质上是使客户端的访问打开/关闭变得容易。我在想,流程应该是这样的:

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


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

< P>你有正确的想法,

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

如果您在托管(外部)解决方案上构建许可证检查器,您只需添加需要许可证密钥加密post的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的连接,如果这不起作用,请致电您

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

然后,您的托管解决方案就可以加载到类中并检查所请求版本的许可证,而无需任何post,或者如果您希望分离托管应用程序和许可证服务器,您可以在本地副本上实现相同的检查,这样您就没有两个不同的代码基础

注意事项: 您不必发送公司ID,您只需使用数据库的SHA1功能搜索数据库,并进行直接查找检查即可获得过期信息和其他信息

安全数据: 如果您实现了一个安全的应用程序,因为它保存的数据由于某种原因无法公开,以减少黑客攻击,请将许可证系统设置在不同的端口上,并在服务器设置中允许它仅通过外部调用在该端口上建立连接。首先,linux路由框将非常适合这样做,因为iptables可以非常简单地做到这一点不确定在windows上安装有多容易

更新: 确保牌照不致作废

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

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

额外的一英里

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

有了上述功能,您甚至可以更好地为每个许可证密钥创建一个新证书,这将使“置零”变得极其困难*


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

当您停业而中央服务器不存在时,客户的风险敞口是什么样的?他们可以修复内部网安装吗?如果您没有很好的答案,则可能会阻止您的产品采用这种类型的授权服务器。更新以显示如何从许可证服务器而不是托管服务器上运行此功能。如果我“停业”,并且无法再托管web服务,我将如何解释这种情况。我真的无法访问每个客户端安装并在本地进行更新。我在想,可能会发布某种补丁,一旦我们的许可证验证关闭,该软件就会自动免费。如果你停业,你的服务器就会离线,因此,缓存将一直工作到许可证到期,然后,当您的企业停业时,他们无法请求新的缓存,并且软件将停止工作,因为它是基于许可证的,或者如果您想这样做