




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于.NET架构带授权验证机制控件的开发1 引言在开发商业软件时,往往需要给软件实现某种类型的许可,以限制非授权用户的使用。一般情况下,开发者会采取建立并检查特定的授权文件或在注册表中添加表项的方法来实现授权机制。但对于商业控件的开发而言,它所面对的对象是二次开发者而不是最终用户,采用传统的方法进行授权验证会有不少的问题。令人欣喜的是,.NET框架提供了内置的授权方案,利用它能非常方便的实现带授权机制的控件开发,并且开发者可以覆盖它并创建自己的授权验证方案。下面以开发一个只能输入数字的文本框为例,来探讨其实现过程。2 创建只能输入数字的文本框.NET提供了大量的基本控件,开发者可以采取继承和覆盖的方式,创建符合特殊需求的自定义控件。本例中只能输入数字的文本框,命名为NumericTextBox,继承自标准的TextBox类,但具有下列基本特性:l 允许输入数字l 仅允许输入一个小数点l 允许输入一个减号,但必须是在文本框的首位l 忽略用户输入的其他字符由于较简单,NumericTextBox的代码省略。生成项目,可产生NumericTextBox.dll文件。3 .NET内置授权验证机制.NET框架提供了许可提供程序类(LicFileLicenseProvider类),将其与自定义控件绑定在一起,即可通过LicenseManager.Validate共享方法在控件的构造函数中自动检查授权信息。默认情况下,系统会在控件文件NumericTextBox.DLL所在目录下查找一个扩展名为lic的授权文件,其文件名是控件类的完整名称,例如:NumericTextBox程序集的NumericTextBox类的授权文件的名称应该是NumericTextBox.NumericTextBox.lic。这个lic文件是一个文本文件,.NET规定其内容为如下形式的一串文本:NumericTextBox.NumericTextBox is a licensed component.如果找不到这个文件,或者文件的内容不符,NumericTextBox控件在设计时和运行时都无法被使用,并引发一个异常。下图说明了这一过程:将自定义控件与许可提供程序类LicFileLicenseProvider绑定在设计或运行期间,创建控件对象时自动验证授权文件授权文件是否存在?内容是否正确?验证正确,正常创建控件对象验证不正确,给出异常提示,无法创建控件对象要实现绑定和验证,需要在NumericTextBox类的声明和“Windows 窗体设计器生成的代码”部分作如下修改(黑体部分):Imports System.ComponentModel 引用命名空间 _Public Class NumericTextBox Inherits System.Windows.Forms.TextBox#Region Windows 窗体设计器生成的代码 Private lic As License Public Sub New() MyBase.New() lic = LicenseManager.Validate(GetType(NumericTextBox), Me) 验证授权 InitializeComponent() End Sub 销毁License对象,而不是等待垃圾回收机制启动 Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) If disposing Then If Not (lic Is Nothing) Then lic.Dispose() lic = Nothing End If End If MyBase.Dispose(disposing)End SubEnd Class重新生成NumericTextBox.dll文件,在新建的Windows应用程序中添加并验证此控件。当bin目录下有NumericTextBox.NumericTextBox.lic文件且内容符合要求时,NumericTextBox控件才能被使用;否则会弹出异常提示对话框。4 自定义授权验证机制显然,由于授权文件的内容是相对固定的,内置授权验证机制非常容易被破解,只需将lic文件复制到控件(NumericTextBox.dll)所在目录下即可,用户甚至可以毫不费力的自己建立一个lic文件。通过建立自定义授权验证方案,可以很好地解决这一问题。自定义的许可提供程序类派生自LicenseProvider类,并重写其GetLicense虚拟方法,以实现自定义验证。同时将自定义许可提供程序类的名称作为参数传递给LicenseProvider属性,例如,自定义了一个用于授权验证的类LicWindowsFileLicensePrevider,则新的数字文本框NewNumericTextBox类的结构应改为: _Public Class NewNumericTextBoxEnd ClassClass LicWindowsFileLicenseProviderInherits LicenseProviderEnd ClassLicWindowsFileLicensePrevider类的GetLicense方法由LicenseManager.Validate方法间接调用(在自定义控件的构造函数中自动执行),并可接收几个参数,用来确定当前指定控件的名称、当前是工作在设计时还是运行时,以及其他信息。若验证通过,GetLicense方法返回一个许可对象,正常运行;否则,抛出一个异常并返回Nothing,使自定义控件不可创建或不可使用。具体的授权验证方案可以有很多,例如:要求注册用户提供其硬盘序列号,按自己设定的特殊算法变换后生成授权文件.lic,再返还给用户放置在特定位置;在GetLicense方法中,用相同的方法获取用户的硬盘序列号并变换,与授权文件的内容相比较,以检查用户是否为合法用户等等。在下面的例子中,为简单起见,只在设计时检查授权许可,直接用硬盘的序列号作为授权文件的内容,且假定授权文件位于Windows系统目录下(一般为C:WindowsSystem32)。授权文件的生成可由开发者单独写一个程序,根据用户提供的信息产生相应的授权文件,部署到用户计算机的特定位置。本例演示时,只需用记事本建立一个名为NewNumericTextBox. NewNumericTextBox.lic文件,内容为硬盘的序列号串,复制到Windows系统目录下即可。自定义控件NewNumericTextBox的完整代码如下:Imports System.ManagementImports System.ComponentModel _Public Class NewNumericTextBox Inherits System.Windows.Forms.TextBox 参见2、3部分代码End ClassClass LicWindowsFileLicenseProvider Inherits LicenseProvider Public Overrides Function GetLicense(ByVal context As LicenseContext, ByVal typ As System.Type, ByVal instance As Object, ByVal allowExceptions As Boolean) As License Dim ctrlName As String = typ.FullName 获取控件的完全名称 If context.UsageMode = LicenseUsageMode.Designtime Then 设计时验证授权 Dim filename As String = Environment.SystemDirectory() & & ctrlName & .lic Dim fs As System.IO.StreamReader 授权文件位于Windows系统目录下 Try fs = New System.IO.StreamReader(filename) Dim licText As String = fs.ReadToEnd 读取授权文件的内容 Dim searcher As New ManagementObjectSearcher(SELECT * FROM Win32_PhysicalMedia) Dim strHardDiskID As String = Dim mo As ManagementObject For Each mo In searcher.Get() strHardDiskID = mo(SerialNumber).ToString().Trim() Exit For Next以上代码用于获取第一物理硬盘的序列号,注意需在解决方案资源管理器中添加对System.Management命名空间的引用 If licText strHardDiskID Then Throw New ArgumentException 文件内容与获取的信息不符,抛出异常 End If Catch ex As Exception If allowExceptions Then Throw New LicenseException(typ, instance, Cant find design-time license for & ctrlName) Else Return Nothing End If Finally If Not (fs Is Nothing) Then fs.Close() End Try Return New DesignTimeLicense(Me, typ) 返回一个设计时对象 Else Return New RuntimeLicense(Me, typ) 对运行时授权未作检查,直接返回一个运行时对象 End If End Function Public Class DesignTimeLicense 设计时许可的嵌套类 Inherits License Private owner As LicWindowsFileLicenseProvider Private typ As Type Sub New(ByVal owner As LicWindowsFileLicenseProvider, ByVal typ As Type) Me.owner = owner Me.typ = typ End Sub Overrides ReadOnly Property LicenseKey() As String Get Return typ.FullName End Get End Property Overrides Sub Dispose() End Sub End Class Public Class RuntimeLicense 运行时许可的嵌套类 Inherits License Private owner As LicWindowsFileLicenseProvider Private typ As Type Sub New(ByVal owner As LicWindowsFileLicenseProvider, ByVal typ As Type) Me.owner = owner Me.typ = typ End Sub Overrides ReadOnly Property LicenseKey() As String Get Return typ.FullName End Get End Property Overrides Sub Dispose() End Su
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 亲情话题的课件
- 亲子阅读汇报课件
- 公司考勤管理培训课件
- 少儿才艺比赛策划书
- 物业综合经理工作总结
- 美术室规章制度
- 研究生个人年终总结报告
- 行政人事年终个人工作总结
- 《表情丰富的脸》课件
- 《虽有嘉肴》课件
- 剑桥Think第一级Unit+1+Welcome课件
- 横河CS3000工程师培训资料
- LY/T 3355-2023油茶
- 消防初级考试题库
- 张掖固化抛光地坪施工方案
- 《兽医内科学与兽医临床诊断学14243》自考复习重点题库(300题)
- GB/T 42834-2023油气管道安全仪表系统的功能安全运行维护要求
- GB/T 7588.1-2020电梯制造与安装安全规范第1部分:乘客电梯和载货电梯
- GB/T 37573-2019露天煤矿边坡稳定性年度评价技术规范
- GB/T 33467-2016全自动吹瓶灌装旋盖一体机通用技术要求
- GB/T 20481-2006气象干旱等级
评论
0/150
提交评论