小編給大家分享一下ASP.NET服務(wù)器控件授權(quán)的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比殷都網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式殷都網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋殷都地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴。
大家知道,微軟.NET框架有一個(gè)內(nèi)置的可擴(kuò)展授權(quán)結(jié)構(gòu),在此基礎(chǔ)上,可提供進(jìn)行優(yōu)化的對ASP.NET服務(wù)器控件授權(quán)。此外,還可以擴(kuò)展該授權(quán)實(shí)現(xiàn),以創(chuàng)建自定義授權(quán)方案,例如:
◆簡單授權(quán)方案 - 只檢查是否存在有效的許可數(shù)據(jù),以決定是否啟用控件。
◆按每次使用授權(quán)方案 - 經(jīng)過某個(gè)使用計(jì)數(shù)后,許可過期。此方案可用于控件的演示版。許可過期后,應(yīng)用程序開發(fā)人員可以注冊(和購買)您的控件,然后收到一個(gè)不過期許可。
◆只有當(dāng)請求來自特定客戶機(jī)(如本地計(jì)算機(jī))時(shí),才在某個(gè)頁面中啟用 ASP.NET服務(wù)器控件授權(quán)方案。此方案可用于實(shí)現(xiàn)控件的試用版。
◆依靠加密來防止應(yīng)用程序開發(fā)人員進(jìn)行許可數(shù)據(jù)欺騙的授權(quán)方案。
ASP.NET服務(wù)器控件授權(quán)要求
ASP.NET服務(wù)器控件授權(quán)方案必須滿足以下要求:
◆支持不編譯方案。ASP.NET Web 應(yīng)用程序常常使用動態(tài)編譯模型,因此沒有與應(yīng)用程序相關(guān)聯(lián)的預(yù)編譯程序集。授權(quán)機(jī)制不應(yīng)該依靠在應(yīng)用程序的程序集中找到作為程序集資源嵌入的許可。
◆支持運(yùn)行時(shí)授權(quán)。頁面開發(fā)人員使用可視設(shè)計(jì)時(shí)工具及簡單文本編輯器,來開發(fā)自己的頁面。授權(quán)機(jī)制不能依靠設(shè)計(jì)時(shí)檢查,必須提供運(yùn)行時(shí)驗(yàn)證。而且,運(yùn)行時(shí)授權(quán)實(shí)現(xiàn)不應(yīng)與任何(可選的)設(shè)計(jì)時(shí)授權(quán)實(shí)現(xiàn)有依賴關(guān)系。
◆支持許可緩存機(jī)制。理想情況下,每個(gè)應(yīng)用程序只應(yīng)該檢索一次許可數(shù)據(jù),而不是針對每個(gè)頁面請求都進(jìn)行檢索,因?yàn)闄z索邏輯會涉及開銷較大的操作,例如,打開文件和對信息解密。應(yīng)該在第一次需要許可時(shí)創(chuàng)建許可,并進(jìn)行緩存,以便以后在服務(wù)器上重用。您仍然可以在每次使用許可來實(shí)現(xiàn)基于使用的授權(quán)方案時(shí),驗(yàn)證緩存的許可。
◆支持 XCOPY 部署。ASP.NET 使得頁面開發(fā)人員能夠只是通過在網(wǎng)絡(luò)上的計(jì)算機(jī)之間復(fù)制文件,就可以部署其 Web 應(yīng)用程序。授權(quán)方案不應(yīng)該依靠注冊表,或者其他禁止簡單 XCOPY 部署的特定于計(jì)算機(jī)的資源。
為簡單起見,我們在前面的列表中使用了服務(wù)器控件這個(gè)術(shù)語。不過,授權(quán)要求適用于所有 ASP.NET服務(wù)器組件。同樣,本文中描述的 ASP.NET 控件授權(quán)方案也適用于其他 ASP.NET服務(wù)器組件。
已授權(quán)控件演練
ASP.NET服務(wù)器控件授權(quán)涉及三個(gè)關(guān)鍵元素:
◆控件中支持授權(quán)的代碼
◆許可數(shù)據(jù)
◆檢查許可數(shù)據(jù)、發(fā)放許可以及在后來使用控件時(shí)驗(yàn)證許可的類
已授權(quán)服務(wù)器控件
下面列出的 LicensedLabel 服務(wù)器控件是從 ASP.NET System.Web.UI.WebControls.Label 控件派生的,并為其添加了授權(quán)支持。以粗體顯示的代碼提供了授權(quán)功能。
// 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)); } } }
該示例說明了為支持授權(quán),您必須向任何服務(wù)器組件的代碼添加下列內(nèi)容:
◆在控件的構(gòu)造函數(shù)中,調(diào)用System.ComponentModel.LicenseManager 類的靜態(tài)方法Validate,并將它作為參數(shù)傳遞到組件的類型中。如果該控件沒有有效許可,LicenseManager 的 Validate 方法將引發(fā) System.ComponentModel.LicenseException。另一種方法是,在構(gòu)造函數(shù)中,您可以調(diào)用 LicenseManager 類的靜態(tài)方法 IsValid,這樣就不會引發(fā)異常。如果您希望在沒有有效許可的情況下啟用控件(在簡裝版本上就是如此),請調(diào)用 IsValid 方法。
◆將System.ComponentModel.LicenseProviderAttribute 元數(shù)據(jù)屬性應(yīng)用于您的組件,并向它傳遞執(zhí)行組件授權(quán)的許可提供程序(從 System.ComponentModel.LicenseProvider 派生的類)的類型。本文中ASP.NET服務(wù)器控件授權(quán)基礎(chǔ)結(jié)構(gòu)一節(jié)顯示了 LicensedLabel 控件的許可提供程序 ServerLicenseProvider 的實(shí)現(xiàn)。
如圖 1 所示,您為支持授權(quán)而必須對控件所做的更改是最小的。真正的授權(quán)功能在許可提供程序類中,稍后再說明這部分內(nèi)容。
圖 1. LicensedLabelTest.aspx 頁嘗試在沒有有效許可的情況下使用 LicensedLabel 時(shí)生成的錯誤
如果您已經(jīng)在 Windows窗體控件中實(shí)現(xiàn)了授權(quán),您可能很驚奇地發(fā)現(xiàn),LicensedLabel 不處置其許可。這是因?yàn)椋琇icensedLabel 使用一個(gè)在服務(wù)器上緩存許可的許可提供程序。
許可數(shù)據(jù)
許可數(shù)據(jù)提供由授權(quán)結(jié)構(gòu)進(jìn)行驗(yàn)證并合并到許可中的信息。您可以用許多不同的方式提供許可數(shù)據(jù)(如過期日期、使用計(jì)數(shù)或唯一密鑰)。許可數(shù)據(jù)的類型和位置由特定的授權(quán)方案來指定。通常在擴(kuò)展名為.lic 的文件中提供許可數(shù)據(jù)。圖1中的LicensedLabel控件的許可數(shù)據(jù)位于一個(gè)名為 LicensedControls.LicensedLabel.lic 的文件中,該文件只包含文本 "LicensedControls.LicensedLabel is licensed"。
在頁面上使用已授權(quán)控件
隨本文的代碼示例提供的 ReadMe 文檔描述了如何構(gòu)建這些示例。
在頁面中使用 LicensedLabel 控件
1.將 LicensedControls 程序集(包含 LicensedLabel 控件)復(fù)制到應(yīng)用程序的 \Bin 目錄。如果您使用的是 Microsoft Visual Studio? .NET 并在您的 Web 應(yīng)用程序項(xiàng)目中添加了對 LicensedControls 項(xiàng)目的引用,則不需要此步驟。
2.將 LicensedControls.LicensedLabel.lic 文件復(fù)制到應(yīng)用程序的 Licenses\LicensedControls\1.0.0.0 目錄。
現(xiàn)在,您應(yīng)該能從應(yīng)用程序中的任何頁面使用控件。
下面的代碼顯示了一個(gè)使用 LicensedLabel 控件的頁面。
<%@ Page language="c#" %> <%@ Register TagPrefix="lc" Assembly="LicensedControls" Namespace="LicensedControls" %>LicensedLabel Sampletitle> head>