C# - Kontrolok felhasználásának korlátozása

Kontrolok engedélyezése 1. rész

forráskód letöltése
A .NET Framework System.ComponentModel névterében találunk néhány osztályt, melyekkel lehetőségünk van a saját fejlesztésű kontrolokhoz – mind a Windows-os, mind pedig a webes kontroljainkhoz – engedélyeket (licenceket) rendelni. Háromrészes sorozatunk első részében bemutatjuk, hogyan tudjuk ezt megtenni, mely osztályokról van szó, és milyen teendőink vannak a kontrolt felhasználó alkalmazásban.
A mellékelt példa megnyitása előtt szükséges egy CLClient nevű virtuális könyvtár létrehozása, mely a példa könyvtárában található CLClient mappára mutat. Ehhez futtassa le a mellékelt CreateVD.js parancsállományt.
A mellékelt példában elkészítünk egy webes kontrolt, valamint egy ASP.NET alkalmazást, mely a kontrolt használja. A kontrol csak abban az esetben használható megfelelően, ha a webes alkalmazásban – a licenszes mappában – megtalálható a kontrolhoz tartozó .LIC állomány, és az a megfelelő információt hordozza. Ellenkező esetben a WebForm1.aspx lapra irányuló webes kérést a WebForm2.aspx lap szolgálja ki, megjelenítve egy hibaüzenetet. Vizsgáljuk meg részletesen a projekteket.
CLLibrary projekt
A kontrol osztálya mellett létrehoztunk két osztályt, melyek a bevezetőben említett névtér osztályaiból származnak. A ServerLicense osztály őse a License osztály, mely a kontrolhoz kapcsolható licence-t produkálja. Az osztályból származtatott osztály kódjában a LicenseKey property-t, valamint a Dispose metódust kell felüldefiniálni a helyes működés érdekében.
A property deklarációja a következő:
LicenseKey
Osztály: License
public abstract string LicenseKey {get;}
Egy Unicode karakterlánc formájában adja vissza a licensz alapját képező kulcsot. Ezt majd a LicenseProvider osztályból származtatott osztályunkban használjuk fel.
A felüldefiniált property deklarációja a következő:
public override string LicenseKey
{
  get
  {
    return key;
  }
}
Az engedély gazdáját reprezentáló kontrol típusának megadása érdekében létrehoztunk egy property-t, melynek neve LicensedType.
public Type LicensedType
{
  get
  {
    return type;
  }
}
Az SLicenseProvider osztály a LicenseProvider absztrakt osztályból származik, és a kontrol engedélyének létrehozását, majd ellenőrzését végzi el metódusainak segítségével. A származtatott osztályban a GetLicense metódust kell felülírnunk. A metódus eredeti deklarációja a következő:
GetLicense
Osztály: LicenseProvider
public abstract License GetLicense(
LicenseContext context, Type type, object instance, bool allowExceptions
);
Generál egy valódi engedélyt a kontrolhoz.
Paraméterek
LicenseContext context
A kontextus, melyben a licence használható. A UsageMode felsorolt típusú property-jének értéke (Designtime, Runtime) adja meg, hogy szerkesztési vagy futási időben használható az engedély.
Type type
A kontrol típusa, melyhez a licence kapcsolható.
object instance
Az objektumpéldány.
bool allowExceptions
Megadható, hogy a kivétel-generálás engedélyezett-e vagy sem.
Visszatérési érték
A kontrolhoz generált licence.
Az osztályban létrehoztunk virtuális metódusokat, melyekkel az engedély generálható abban az esetben, ha nem áll rendelkezésre objektum. Ezek a CreateLicense és a CreateEmptyLicense metódusok.
A GetLicenseDataStream és a GetLicenseData metódusokkal beolvassuk a licenszes mappából a .LIC állományt, adatfolyammá konvertáljuk, majd szöveggé, hogy ellenőrizni tudjuk.
A licence-állományok általában speciális elérési útvonalon helyezkednek el, mint példánkban is. A licenszes mappában találunk egy mappát, melynek neve a kontrolt tartalmazó assembly nevével azonos, majd ezen belül egy mappát, mely a kontrol verziószámával azonos. Ezen belül találjuk az assembly-név.osztálynév.lic séma szerint elnevezett engedélyállományt, mely az egyszerűség kedvéért most csak egy mondatot tartalmaz.
A kontrol AssemblyInfo.cs állományában a verziószámot át kellett írnunk a 1.0.0.0 konstansra, hogy a betöltéskor le tudjuk kérdezni.
[assembly: AssemblyVersion("1.0.0.0")]
A ValidateLicenseData metódusban ellenőrizzük le, hogy a licence-állományban található szöveg megegyezik-e azzal, amit a kontrol elvár. Amennyiben igen, akkor a kontrol használható. Mivel egy Label kontrolról van szó, a Text property-ben megadott szöveg olvasható a weblapon. Ellenkező esetben a WebForm2.aspx lap töltődik be.
A kontrol kódja egyszerű. Funkcionalitásban nem tér el az ősosztályból, hiszen most nem is ez volt a lényeges, csupán az engedélyt ellenőrizzük. A LicenseManager osztály statikus Validate metódusának meghívásával tehetjük ezt meg, a következőképpen:
public CLControl()
{
  LicenseManager.Validate(typeof(CLControl));
}
A kontrol osztályának deklarálásakor a LicenseProvider attribútumban meg kell adni az engedélyt produkáló osztály nevét, jelen esetben a SLicenseProvider nevet. Ezt használja majd a LicenseManager osztály is.
[LicenseProvider(typeof(SLicenseProvider))]
public class CLControl : Label
{
  ...
CLLibrary projekt
Az alkalmazásban nincs teendőnk, csak használnunk kell a kontrolt a HTML oldalon.
<cc1:CLControl id="CLControl1" style="..." runat="server"  Font-Bold="True">Ha ez a felirat olvasható, akkor a kontrol megfelelő LICENSE-dokumentummal rendelkezik.</cc1:CLControl>
A kontrolok engedélyének megadása és ellenőrzése abban az esetben lehet hasznos, ha meg akarjuk akadályozni, hogy a kontrolt illetéktelenek használják. Ebben a szituációban az engedélyt csak a meghatározott felhasználónak bocsátjuk a rendelkezésére, egyéb esetekben nem mellékeljük.
A kontrol ellenőrzési mechanizmusát ellenőrizendő, távolítsuk el az állományt a mappából, vagy változtassuk meg a szövegét.
A sorozat további számaiban bonyolultabb engedély-állományokat hozunk létre és módosítjuk az ellenőrzési rendszert is.

Kontrolok engedélyezése cikksorozat

Kontrolok felhasználásának korlátozása - Kontrolok engedélyezése 1. rész