ASP.NET服务器控件授权的示例分析
小编给大家分享一下ASP.NET服务器控件授权的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
大家知道,微软.NET框架有一个内置的可扩展授权结构,在此基础上,可提供进行优化的对ASP.NET服务器控件授权。此外,还可以扩展该授权实现,以创建自定义授权方案,例如:
◆简单授权方案 - 只检查是否存在有效的许可数据,以决定是否启用控件。
◆按每次使用授权方案 - 经过某个使用计数后,许可过期。此方案可用于控件的演示版。许可过期后,应用程序开发人员可以注册(和购买)您的控件,然后收到一个不过期许可。
◆只有当请求来自特定客户机(如本地计算机)时,才在某个页面中启用 ASP.NET服务器控件授权方案。此方案可用于实现控件的试用版。
◆依靠加密来防止应用程序开发人员进行许可数据欺骗的授权方案。
ASP.NET服务器控件授权要求
ASP.NET服务器控件授权方案必须满足以下要求:
◆支持不编译方案。ASP.NET Web 应用程序常常使用动态编译模型,因此没有与应用程序相关联的预编译程序集。授权机制不应该依靠在应用程序的程序集中找到作为程序集资源嵌入的许可。
◆支持运行时授权。页面开发人员使用可视设计时工具及简单文本编辑器,来开发自己的页面。授权机制不能依靠设计时检查,必须提供运行时验证。而且,运行时授权实现不应与任何(可选的)设计时授权实现有依赖关系。
◆支持许可缓存机制。理想情况下,每个应用程序只应该检索一次许可数据,而不是针对每个页面请求都进行检索,因为检索逻辑会涉及开销较大的操作,例如,打开文件和对信息解密。应该在第一次需要许可时创建许可,并进行缓存,以便以后在服务器上重用。您仍然可以在每次使用许可来实现基于使用的授权方案时,验证缓存的许可。
◆支持 XCOPY 部署。ASP.NET 使得页面开发人员能够只是通过在网络上的计算机之间复制文件,就可以部署其 Web 应用程序。授权方案不应该依靠注册表,或者其他禁止简单 XCOPY 部署的特定于计算机的资源。
为简单起见,我们在前面的列表中使用了服务器控件这个术语。不过,授权要求适用于所有 ASP.NET服务器组件。同样,本文中描述的 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,这样就不会引发异常。如果您希望在没有有效许可的情况下启用控件(在简装版本上就是如此),请调用 IsValid 方法。
◆将System.ComponentModel.LicenseProviderAttribute 元数据属性应用于您的组件,并向它传递执行组件授权的许可提供程序(从 System.ComponentModel.LicenseProvider 派生的类)的类型。本文中ASP.NET服务器控件授权基础结构一节显示了 LicensedLabel 控件的许可提供程序 ServerLicenseProvider 的实现。
如图 1 所示,您为支持授权而必须对控件所做的更改是最小的。真正的授权功能在许可提供程序类中,稍后再说明这部分内容。
图 1. LicensedLabelTest.aspx 页尝试在没有有效许可的情况下使用 LicensedLabel 时生成的错误
如果您已经在 Windows窗体控件中实现了授权,您可能很惊奇地发现,LicensedLabel 不处置其许可。这是因为,LicensedLabel 使用一个在服务器上缓存许可的许可提供程序。
许可数据
许可数据提供由授权结构进行验证并合并到许可中的信息。您可以用许多不同的方式提供许可数据(如过期日期、使用计数或唯一密钥)。许可数据的类型和位置由特定的授权方案来指定。通常在扩展名为.lic 的文件中提供许可数据。图1中的LicensedLabel控件的许可数据位于一个名为 LicensedControls.LicensedLabel.lic 的文件中,该文件只包含文本 "LicensedControls.LicensedLabel is licensed"。
在页面上使用已授权控件
随本文的代码示例提供的 ReadMe 文档描述了如何构建这些示例。
在页面中使用 LicensedLabel 控件
1.将 LicensedControls 程序集(包含 LicensedLabel 控件)复制到应用程序的 \Bin 目录。如果您使用的是 Microsoft Visual Studio? .NET 并在您的 Web 应用程序项目中添加了对 LicensedControls 项目的引用,则不需要此步骤。
2.将 LicensedControls.LicensedLabel.lic 文件复制到应用程序的 Licenses\LicensedControls\1.0.0.0 目录。
现在,您应该能从应用程序中的任何页面使用控件。
下面的代码显示了一个使用 LicensedLabel 控件的页面。
<%@ Page language="c#" %> <%@ Register TagPrefix="lc" Assembly="LicensedControls" Namespace="LicensedControls" %>LicensedLabel Sampletitle> head>