65.9K
CodeProject 正在变化。 阅读更多。
Home

最佳 .NET 开发者许可软件

starIconstarIconstarIconstarIconstarIcon

5.00/5 (5投票s)

2015 年 9 月 18 日

CPOL

12分钟阅读

viewsIcon

18654

如果您是一名正在销售产品的软件开发人员,那么您需要考虑如何为您的软件获得许可。鉴于有许多可用的许可选项,这可能是一个相当困难的决定。

SoftwareLicensing

许可概述

如果您是一名正在销售产品的软件开发人员,那么您需要考虑如何为您的软件获得许可。

鉴于有许多可用的许可选项,这可能是一个相当困难的决定。在考虑产品的许可工具时,首先要理解的是,没有一种工具可以使您的产品完全免受那些想要非法使用您软件的人的侵害。总会有人,如果您的产品足够好,他们就会想绕过任何许可,以便免费使用它。

许可的目的是确保您为自己提供某种程度的保护,这样“软件盗版者”就无法在试用期结束后未经适当注册和购买就轻易使用您的产品。然后,您的产品许可将阻止大多数此类人,除非是最顽固的“许可破解者”。

下一个考虑因素是您希望实现的许可类型。在这种情况下,有两种模型:**“加密”**许可,一旦购买,允许客户在需要时将您的产品安装在任意数量的计算机上;或者**“经过身份验证的”**许可,允许有限次数的安装和卸载。

.NET 软件开发中的第一种许可类型随着 .NET 框架中内置的许可模型而出现。然而,这或多或少只是第三方更复杂的许可方案的一个钩子。在框架中按原样使用 .NET 许可模型是一种相当薄弱的实现这种保护形式的方式。

“**加密**”许可主要允许一次性购买您的软件,即使有更复杂的可用方案,也可能被滥用,因为单个产品会在未购买您软件的多个方之间传递和共享许可。对于个人商业开发人员来说,使用法律途径来保护此类产品许可方法的版权侵权几乎是无济于事的,因为只有大型成熟公司才能负担得起与之相关的成本。

尽管如此,如果计划是基于功能集进行软件许可,通过为每个功能集提供不同的定价许可,那么一般许可可能是一个考虑因素。公司确实成功地使用了这种许可方案,尽管它仍然存在潜在滥用的漏洞。

但是,对于个人软件开发人员来说,使用“**经过身份验证的**”许可模型可能更具成本效益,它本身实现起来稍微复杂一些,但为您的产品提供了更高级别的保护。

Infralution 许可

考虑到个人开发人员的预算有限,价格昂贵的许可工具可能负担不起,这会迫使开发人员觉得他们不得不妥协来保护他们的知识产权。这不必是这样的。

有一个许可工具可以轻松地适应任何开发人员的预算;Infralution 的许可系统,可以在以下链接找到……http://infralution.com/licensing.html

InfralutionSoftware

对于单人开发者许可证,价格为 170.00 美元,非常实惠。这款出色的软件已上市超过 10 年,并提供“**加密**”许可和“**经过身份验证的**”许可,两者都在同一个软件包中。此外,整个工具集均可获得源代码,但需额外付费。

有人可能会怀疑,如果源代码可用于此软件包中的所有工具,那么使用此软件是否会使您的许可方案容易受到攻击。答案是根本不会,因为,就像大多数加密过程一样,重要的是算法(虽然,为了获得良好的安全性,您确实想要一个强大的算法),而是用于生成您产品许可的密钥。此外,如果使用“身份验证”选项,则许可生成算法的任何代码都不在相应的 Web 服务中。结果,即使有人闯入您的网站,他们也找不到任何东西。所有此类代码都保存在发生许可生成的开发人员工作站级别。

Infralution 许可系统可用于以下 .NET 项目类型……

  • .NET
  • Windows Forms(桌面应用程序)
  • Windows Presentation Foundation(桌面应用程序)
  • 类库
  • 紧凑型框架

使用软件

以下信息是对如何实现 Infralution 许可系统的一个非常笼统的概述。它并非旨在成为您可能需要的唯一信息,因为任何类型的许可系统都有其自身的复杂性,但此概述确实表明了将此软件集成到您的产品中的相对容易程度。


要使用您的产品实现任一许可方案,将需要以下工具和流程……

用于加密许可

  • 许可跟踪器工具(许可生成器和分发器)
  • 许可程序集(对应于产品类型)
  • 产品中的开发人员定义的许可代码

用于经过身份验证的许可

  • 许可跟踪器工具(许可生成器和分发器)
  • 许可程序集(对应于产品类型)
  • 产品中的开发人员定义的许可代码
  • 身份验证 Web 服务

**许可跟踪器**工具是您将使用的主要软件,用于输入您的产品许可参数集并生成您的实际产品许可和您的许可验证字符串(每套许可及其对应的验证字符串均由您在许可跟踪器中设置的每个产品定义和生成),无论是“加密”还是“经过身份验证的”许可类型。它是一个功能广泛的工具,要充分发挥其功能,有必要查阅软件包附带的帮助文件,该文件相当全面(提供 30 天免费试用下载,以便您获取帮助文件以供查阅)。

总的来说,当网站收到软件订单时,许多公司会为客户生成许可,然后通过电子邮件发送给他们。**许可跟踪器**可以与 Microsoft Outlook 集成,以协助向客户进行此类许可邮件发送。它还可以与您允许分发您软件的经销商集成,例如 ShareIt 和 PayPal。因此,您可以导入他们关于您的产品销售/试用下载的数据到**许可跟踪器**中,以便进行许可邮件发送和许可调整(例如,延长试用许可),在适用情况下。

另一种向客户发送购买的许可的方式是,让您的网站为您完成。但这需要一些手动干预。在这种情况下,您需要预先生成一定数量的您的产品许可,然后将它们加载到数据库表中,这样当发生购买时,您就可以在客户在购买后返回您的网站时立即向其提供许可,如果您使用允许此类重定向的第三方支付处理器。PayPal 以其 Web 支付标准流程而闻名,这也是它仍然受到许多小型企业欢迎的原因之一。

但是,如果您实现 PayPal 的 Web-Pro 功能或 Authority.NET 等支付流程 API;那么您的客户在付款时永远不会离开您的网站,您对流程的控制力会更强,而无需担心网站重定向。这使得自动生成和提供许可的功能更加简单,对您的客户也更加方便。

使用这种替代性的许可提供方法可以让您的网站在此实例中为您处理所有事务。

但是,要警惕此方法论中的关键弱点。将一组预先生成的许可上传到您网站上的数据库表中可能会容易受到安全漏洞的攻击,从而可能获取您所有存储的许可。这可以通过在存储之前加密所有许可,并在提供给客户时解密它们来纠正。然后,建议使用的安全组件应该是高度混淆的。

**将正确的程序集应用于您的产品代码**是开始将许可软件与您的产品集成的第一步。这非常容易做到,只需选择以下程序集之一,您就可以在您的产品项目中引用它们。

  • Licensing.ASP.dll (ASP.NET)
  • Licensing.Forms.dll (Windows Forms 桌面和类库)
  • Licensing.WPF.dll (Windows Presentation Foundation)
  • Licensing.CF.dll (紧凑型框架)

完成之后,您就可以开始在您的产品源代码的相应模块中实现您的许可“验证”代码了(例如,对于 WPF 产品,它将被输入到“Application.xaml.vb/cs”模块)。

要实现此代码,您必须插入以下代码集……

  • 许可验证字符串
  • 许可验证代码

根据您选择的许可类型(“加密”或“经过身份验证的”),您需要实现的差异代码将有所不同。但是,这两种代码集都相对相似。下面的示例显示了用于“加密”许可类型的代码。

示例许可验证字符串(由许可跟踪器工具生成)

'
' COPYRIGHT: Copyright 2012 Infralution
'
Imports Infralution.Licensing.Forms
Imports System.Environment

'''
''' Defines the license provider to use for the custom control
'''

Public Class MyControlLicenseProvider
Inherits EncryptedLicenseProvider

'''
''' License Validation Parameters String copied from License Tracker
'''

Private Const LICENSE_PARAMETERS As String = _
"" + _
" My Product" + _
" " + _
" zX4VW8ukM8aBMgIeYOhBsH6s+UlbYM3jv3kGy59NA5vBDxaCRclowIXk" + _
" HC+Ue+ua0am7brgWss/N7PetcaleXWUJacRaisC5yjl3WK2UWoPQ37HjKijXM++eCO" + _
" q+mEProZYO7Ux2Q8aA13glAXn5Ry9OePA3YmD4f+658k0x1AE=" + _
" AQAB" + _
" " + _
" VyWFO92791568I4C/iw5bNi8y4yhv0GE4/m+5MWMsAlOdIe7GWr3v" + _
" 57rxtMo9iPyfMyHJhLLJHBkuANsI0gWUiaAfyMhpHdM893mkc4PEz8KS+ZSvUCVklNWiP" + _
" WPQUT0cDd6FSxCVjujBoZmIGYe4KglA8vjd2YxtHm7ZgTPYG4=" + _
" YCO+TnF/qnmLuY+NiINXPal3uSZiBuCvlI6RUDtsoVxSV5eld0P4av" + _
" a+m9+viKYMBLd/tOIiNH+Jh1ZQIMeWtDNndxyoRr2S1eRp0fb5XYHk8bvUUJB81a9eSrJ36" + _
" 6YgZwzXuL2oNw4hilZBQCgUgDWEwD4c2meD0dkE5MkTOdI=" + _
" 7" + _
""

'''
''' The name of the file to store the license key in - the sub directory is created
''' automatically by ILS
'''

Private Shared _licenseFile As String = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\MyLicensedControl\MyLicensedControl.lic"

Public Sub New()
MyBase.New(LICENSE_PARAMETERS, _licenseFile)
End Sub

End Class

**示例许可验证代码**

Imports Infralution.Licensing.Forms
Imports System.ComponentModel
<LicenseProvider(GetType(MyControlLicenseProvider))> _
Public Class MyControl

    '''

<summary>
    ''' The name to display in the license install form
    ''' </summary>


    Private Const PRODUCT_NAME As String = "My Control"

    '''

<summary>
    ''' The license context last time we checked the license
    ''' </summary>


    ''' <remarks>
    ''' This is used to reduce the number of times the license check needs to be done.
    ''' If your control is likely to be used in multiple places (eg like a text box) 
    ''' then checking the license each time a control is created can be very annoying 
    ''' when in evaluation mode.
    ''' </remarks>
    Shared _lastDesignContext As LicenseContext
    Shared _licenseChecked As Boolean = False

    Public Sub New()
        MyBase.New()
        InitializeComponent()

        ' Is the control being displayed in the designer?
        '
        If LicenseManager.CurrentContext.UsageMode = LicenseUsageMode.Designtime Then

            ' at design time we must check the license every time or else our license may not
            ' get compiled into the application resources
            '
            If Not LicenseManager.IsLicensed(GetType(MyControl)) Then

                ' only show the install dialog if we haven't already done so for this form
                '
                If Not LicenseManager.CurrentContext Is _lastDesignContext Then

                    ' Display the evaluation dialog until the user installs a license or 
                    ' selects Exit or Continue
                    '
                    Dim license As EncryptedLicense = Nothing
                    While license Is Nothing
                        Dim evaluationMonitor As New RegistryEvaluationMonitor("MyControlEvaluationPassword")
                        Dim dialog As New EvaluationDialog(evaluationMonitor, PRODUCT_NAME)
                        Dim dialogResult As EvaluationDialogResult = dialog.ShowDialog()
                        If dialogResult = EvaluationDialogResult.Exit Then
                            Throw New LicenseException(GetType(MyControl), Me, "Control not Licensed")
                        End If
                        If dialogResult = EvaluationDialogResult.Continue Then Exit While
                        If dialogResult = EvaluationDialogResult.InstallLicense Then
                            Dim licenseForm As New EncryptedLicenseInstallForm()
                            license = licenseForm.ShowDialog(New MyControlLicenseProvider(), license, PRODUCT_NAME)
                        End If
                    End While
                    _lastDesignContext = LicenseManager.CurrentContext
                End If

            End If

        Else

            ' at runtime only check the license if we haven't already done so
            '
            If Not _licenseChecked Then

                ' show a nag screen if the control is not licensed
                '
                If Not LicenseManager.IsLicensed(GetType(MyControl)) Then
                    MessageBox.Show("This application was created using an unlicensed version of MyControl", "Unlicensed Application")
                End If
            End If
        End If
        _licenseChecked = True
    End Sub

End Class

从上面的代码可以看出,所有的许可查询/输入表单和许可验证都由一套相对较小的代码处理。这对于“加密”和“经过身份验证的”两种许可类型都是如此。

但是,**如果您选择使用“经过身份验证的”许可类型**,那么您除了将上述代码输入到您的产品中之外,还有一些额外的工作要做。您还必须为您的网站配置身份验证服务器。这比仅仅使用“加密”许可方案要复杂一些。但是,Infralution 的总体支持非常好,他们很乐意在合理的时间内回答您的所有问题。如果您觉得获得外部协助来完成此设置过程更有益,Infralution 会以合理的费用为您在您的网站上设置此服务。

尽管这项服务增加了复杂性,但使用许可身份验证系统确实大大提高了您产品的安全性。对于大多数专业开发人员来说,设置该服务应该不会太令人生畏。

首先,Infralution 许可系统包包含了身份验证 Web 服务的完整项目/解决方案。您只需将其作为“子站点”添加到您的网站项目中,然后可以通过 Web 服务协议访问它。

完成此操作后,您可以通过输入以下类型的 URL 来测试身份验证 Web 服务,以确保其正常运行……

http://www.mycompany.com/authenticate/AuthenticationService.asmx

如果您已正确安装 Web 服务,那么您应该会看到一个类似于下面所示的屏幕……

InfralutionAuthenticationWebService

在 Web 服务项目中,您会找到一个名为“Install.aspx”的网页。一旦您证明您的 Web 服务运行正常,您就可以运行此安装页面,它将启动数据库,以支持您软件产品代码库中的许可验证,如前面的示例源代码所示。

**请注意**,如果您使用这种类型的许可,您的软件产品的许可验证字符串将包括 Web 服务的 URL 以及在哪里验证许可。如果您像许多专业开发人员一样,您会想要设置一个 TEST 系统来使用此服务,以确保在将其移至生产环境之前,它已根据您的要求正常运行。为此,您需要生成用于您的 TEST 服务器将与您为 PRODUCTION 服务器生成的服务器相同的许可验证字符串。这意味着您必须为您的产品维护两种类型的生成,或者在许可跟踪器工具中定义您的产品两次;一次用于 TEST,另一次用于 PRODUCTION。

无论哪种情况,您都必须小心您在产品中使用什么验证字符串,以确保它在两种环境中都始终指向正确的服务器。

在所有情况下,当您为产品生成了许可验证字符串并且对它的参数满意后,这些数据就必须通过许可跟踪器工具导出到相应的 Web 服务的数据库中。每当您进行新的许可生成或修改现有许可时,许可跟踪器工具都会通知您必须更新验证数据库,以便客户在尝试注册您的产品时能够正确验证基于给定产品及其参数集生成的许可。

**请注意**,无论您是如前所述预先生成许可还是通过邮件发送方案处理它们,您都无法修改您为产品设置并投入生产的许可参数。如果您这样做,那么任何先前出售的许可都将无法针对 Web 服务的验证过程正常工作,如果它们尚未被客户验证。此外,任何在您进行许可参数修改之前已售出并验证的许可将不再与您的数据库同步,客户卸载和新重新安装也将不再正常工作。

关于此软件所需数据库的说明

Infralution 许可系统将使用两个不同的数据库。第一个是许可跟踪器工具用于存储有关您的产品、为这些产品选择的许可类型、许可生成/验证参数以及生成的许可本身的所有信息的数据库。此数据库可以是下载包中提供的默认 Access 数据库,也可以配置一个针对 SQL Server 的数据库。

第二个数据库是为身份验证 Web 服务准备的,如果您为您的任何产品选择此许可类型,则需要它。但是,在这种情况下,您可以为此要求使用支持许可跟踪器工具的现有数据库。但是,如果使用此选项,那么许可跟踪器工具的数据库也必须位于 Web 服务可以访问的位置。此外,这意味着所有许可数据都将位于一个位置,并且数据未加密。

由于缺乏数据加密,应考虑配置一个单独的身份验证 Web 服务数据库。在这种情况下,只存储许可验证和跟踪信息,这将为此过程提供额外的保护级别。

© . All rights reserved.