Easy-to-use licensing library for .NET 8
This is project is derived from Portable.Licensing And Standard.Licensing library. The purpose of this fork is to add support .Net 6+ going forward, add more Cryptography libraries for users to chose from, and added Bouncy Castle as nuget package for easier maintenance and updates.
For now plan is to rework, so users can choose to you Bouncy Castle or System.Security.Cryptography.Cng, upgrade everything to Net 8, Visual Studio 2022.
Also, idea is to add small License management app, so NetLicensing can be used out of the box.
Finall goal is to have Multiplatform library with multiplatform tool for issuing licences.
At this moment, this is not recommended for production usage, as there will be breaking changes before first release. This and other supporting documents will change as this library is changed.
Get Standard.Licensing from NuGet.
PM> Install-Package Standard.Licensing
Standard.Licensing uses the Elliptic Curve Digital Signature Algorithm (ECDSA) to ensure the license cannot be altered after creation.
First you need to create a new public/private key pair for your product:
var keyGenerator = Standard.Licensing.Security.Cryptography.KeyGenerator.Create();
var keyPair = keyGenerator.GenerateKeyPair();
var privateKey = keyPair.ToEncryptedPrivateKeyString(passPhrase);
var publicKey = keyPair.ToPublicKeyString();
Store the private key securely and distribute the public key with your product. Normally you create one key pair for each product, otherwise it is possible to use a license with all products using the same key pair. If you want your customer to buy a new license on each major release you can create a key pair for each release and product.
Now we need something to generate licenses. This could be easily done with the LicenseFactory
:
var license = License.New()
.WithUniqueIdentifier(Guid.NewGuid())
.As(LicenseType.Trial)
.ExpiresAt(DateTime.Now.AddDays(30))
.WithMaximumUtilization(5)
.WithProductFeatures(new Dictionary<string, string>
{
{"Sales Module", "yes"},
{"Purchase Module", "yes"},
{"Maximum Transactions", "10000"}
})
.LicensedTo("John Doe", "john.doe@example.com")
.CreateAndSignWithPrivateKey(privateKey, passPhrase);
Now you can take the license and save it to a file:
File.WriteAllText("License.lic", license.ToString(), Encoding.UTF8);
or
license.Save(xmlWriter);
The easiest way to assert the license is in the entry point of your application.
First load the license from a file or resource:
var license = License.Load(...);
Then you can assert the license:
using Standard.Licensing.Validation;
var validationFailures = license.Validate()
.ExpirationDate()
.When(lic => lic.Type == LicenseType.Trial)
.And()
.Signature(publicKey)
.AssertValidLicense();
Standard.Licensing will not throw any Exception and just return an enumeration of validation failures.
Now you can iterate over possible validation failures:
foreach (var failure in validationFailures)
Console.WriteLine(failure.GetType().Name + ": " + failure.Message + " - " + failure.HowToResolve);
Or simply check if there is any failure:
if (validationFailures.Any())
// ...
Make sure to call validationFailures.ToList()
or validationFailures.ToArray()
before using the result multiple times.
- dnauck/Portable.Licensing for the original work.
This project is licensed under MIT License.