简介
Microsoft .NET 框架有一个内置的可扩展授权结构,支持所有托管组件(包括业务对象、Windows 窗体控件和 ASP.NET 服务器控件)的设计时授权和运行时授权。本文就建立在该结构的基础上,以提供专门针对 ASP.NET 控件进行优化的授权实现,并且,您可以扩展该授权实现,以创建自定义授权方案,例如:
简单授权方案 - 只检查是否存在有效的许可数据,以决定是否启用控件。
按每次使用授权方案 - 经过某个使用计数后,许可过期。此方案可用于控件的演示版。许可过期后,应用程序开发人员可以注册(和购买)您的控件,然后收到一个不过期许可。
只有当请求来自特定客户机(如本地计算机)时,才在某个页面中启用 ASP.NET 服务器控件的授权方案。此方案可用于实现控件的试用版。
依靠加密来防止应用程序开发人员进行许可数据欺骗的授权方案。
ASP.NET 服务器控件授权要求
ASP.NET 服务器控件授权方案必须满足以下要求:
支持不编译方案。ASP.NET Web 应用程序常常使用动态编译模型,因此没有与应用程序相关联的预编译程序集。授权机制不应该依靠在应用程序的程序集中找到作为程序集资源嵌入的许可。
支持运行时授权。页面开发人员使用可视设计时工具及简单文本编辑器,来开发自己的页面。授权机制不能依靠设计时检查,必须提供运行时验证。而且,运行时授权实现不应与任何(可选的)设计时授权实现有依赖关系。
支持许可缓存机制。理想情况下,每个应用程序只应该检索一次许可数据,而不是针对每个页面请求都进行检索,因为检索逻辑会涉及开销较大的操作,例如,打开文件和对信息解密。应该在第一次需要许可时创建许可,并进行缓存,以便以后在服务器上重用。您仍然可以在每次使用许可来实现基于使用的授权方案时,验证缓存的许可。
支持 XCOPY 部署。ASP.NET 使得页面开发人员能够只是通过在网络上的计算机之间复制文件,就可以部署其 Web 应用程序。授权方案不应该依靠注册表,或者其他禁止简单 XCOPY 部署的特定于计算机的资源。
为简单起见,我们在前面的列表中使用了服务器控件这个术语。不过,授权要求适用于所有 ASP.NET 服务器组件。同样,本文中描述的 ASP.NET 控件授权方案也适用于其他 ASP.NET 服务器组件。
已授权控件演练
控件授权涉及三个关键元素:
控件中支持授权的代码
许可数据
检查许可数据、发放许可以及在后来使用控件时验证许可的类
已授权服务器控件
下面列出的 LicensedLabel 服务器控件是从 ASP.NET System.Web.UI.WebControls.Label 控件派生的,并为其添加了授权支持。以粗体显示的代码提供了授权功能。
// LicensedLabel.cs
//
using System;
using System.ComponentModel;
using System.Web.UI.WebControls;
namespace LicensedControls {
[
LicenseProvider(typeof(ServerLicenseProvider))
]
public class LicensedLabel : Label {
public LicensedLabel() {
LicenseManager.Validate(typeof(LicensedLabel));
}
}
}
该示例说明了为支持授权,您必须向任何服务器组件的代码添加下列内容:
在控件的构造函数中,调用 System.ComponentModel.LicenseManager 类的静态方法 Validate,并将它作为参数传递到组件的类型中。如果该控件没有有效许可,LicenseManager 的 Validate 方法将引发 System.ComponentModel.LicenseException。另一种方法是,在构造函数中,您可以调用 LicenseManager 类的静态方法 IsValid,这样就不会引发异常。如果您希望在没有有效许可的情况下启用控件(