2010-05-24 18 views
15

Sono interessato a scoprire se esistono standard o risorse che è possibile consigliare per lo sviluppo di modelli di licenza in C#?Sviluppo di licenze in C#: da dove iniziare?

+2

possibile duplicato di [Come posso creare un codice Product Key per la mia app C#] (http://stackoverflow.com/questions/453030/how-can-i-create-a-product-key-for-my- c-app) –

+0

Puoi fornirci una descrizione più approfondita di ciò che stai cercando di ottenere? –

+0

Sì, certo. Sono interessato allo sviluppo di più modelli di licenza per la mia applicazione. Esempi: 50 licenza utente, licenza utente illimitata, $ per licenza ordine, licenza di prova ecc. –

risposta

16

In C# è possibile utilizzare il Licensing class fornito da Microsoft. Un campione è disponibile tramite il link.

In sostanza si crea una classe che eredita da LicenseProvider e digitare il

[LicenseProvider(typeof(MyControlLicenseProvider))] 

come un attributo alla classe che si desidera hanno concesso in licenza. Nell'implementazione (MyControlLicenseProvider) è possibile codificare i metodi appropriati per la validazione del titolo alle proprie esigenze e quindi avere la chiamata codice

License license = LicenseManager.Validate(typeof(MyControl), this); 

Se la licenza non è nullo l'applicazione/controllo è concesso in licenza.

Come afferma Sir Graystar, nessun sistema è infallibile e qualcuno con le competenze necessarie potrebbe ingegnarsi durante la convalida. Non passare troppe ore a implementare un sistema duro, ma non renderlo facile da aggirare. :-)

Utilizzando un hash come SHA o una delle funzioni di hash MD e alimentandoli, è possibile utilizzare alcuni dati chiave per creare un semplice controllo di convalida. Il vostro metodo di convalida potrebbe fare qualcosa del calibro di

public override License GetLicense(LicenseContext context, 
            Type type, 
            object instance, 
            bool allowExceptions) 
    if (context.UsageMode == LicenseUsageMode.Designtime) { 
     // Creating a special DesigntimeLicense will able you to design your 
     // control without breaking Visual Studio in the process 
     return new DesigntimeLicense(); 
    } 
    byte[] existingSerialKey = getExistingSerial(); 
    // Algorithm can be SHA1CryptoServiceProvider for instance 
    byte[] data = HashAlgorithm.Create().ComputeHash(
     username, 
     dateRequested, 
     validUntilDate, 
     // any other data you would like to validate 
    ); 
    // todo: also check if licensing period is over here. ;-) 
    for (int l = 0; l < existingSerialKey.Length; ++l) { 
     if (existingSerialKey[i] != data[i]) { 
      if (allowExceptions){ 
       throw new LicenseException(type, instance, "License is invalid"); 
      } 
      return null; 
     } 
    } 
    // RuntimeLicense can be anything inheriting from License 
    return new RuntimeLicense(); 
} 

Questo metodo restituisce un costume License, uno che per esempio ha proprietà per quanto riguarda la concessione di licenze, come un DateTime per il momento in cui licenza si esaurisce. L'impostazione di questo non dovrebbe richiedere troppo tempo, funziona bene sia con WinForms che su siti ASP.NET, e ostacolerà (senza alcuna garanzia implicita) un semplice tentativo di violare la licenza.

+1

Grazie per il codice e consiglio, lo apprezzo molto. Inizierò a scrivere un prototipo. –

1

Non ho mai trovato nulla di simile a uno standard in questo. Quello che farei personalmente è creare un disco o qualcosa di simile che contenga tutta l'informazione sulla licenza e quali funzionalità siano disponibili prima che venga immesso il codice prodotto, e per quanto tempo prima della prova o qualsiasi cosa scada (questo può essere complicato 'voglio confrontare con la data di sistema in quanto questo può essere modificato dall'utente). Quindi si desidera crittografare questo record (magari salandolo e eseguendo l'hashing), in modo che le funzionalità possano essere sbloccate solo quando viene immesso un codice prodotto specifico. Si potrebbe anche voler generare in modo casuale detta chiave, anche se lo farei in un formato specifico in modo che un utente possa sempre riconoscere un codice prodotto quando ne viene fornito uno e non confonderlo con un numero di fattura o altro.

Ricorda che nessun sistema è infallibile e qualcuno in qualche sistema operativo troverà in qualche modo un modo. Questa è probabilmente la ragione per cui non ho mai incontrato nessuno standard, perché nessun metodo è completamente sicuro. Devi solo fare del tuo meglio con esso.

+0

Ehi, grazie per la risposta. Sai se è meglio lavorare con le chiavi o con i file di licenza personalizzati? –

+0

Ho sempre lavorato con le chiavi, ma probabilmente vale la pena esaminare anche i file personalizzati. Ho paura, non nella mia area di conoscenza. –