LicenPro
DocumentationNode-locked license

Node-locked license

A node-locked license binds entitlement to a specific hardware id captured at issuance (or during activation binding flows). Validation compares the machine fingerprint with the payload and server rules, blocking clones and casual sharing.

HardwareId

Stored on license + in signed file.

Rebind flows

API supports confirm/reject/reset binding.

Online checks

Hardware mismatch returns 403 on REST validate.

How it works

The server entity stores HardwareId; the SDK model NodeLockedLicense carries it for offline signature verification and client-side display. When the SDK validates online, mismatch surfaces as LicenseValidationStatus failures or HTTP 403 with HardwareMismatch / DeviceBlocked from POST /api/Licenses/validate depending on path.

Creating a node-locked license (dashboard / API)

  1. Obtain the end user’s hardware id from your onboarding utility (SDK computes a stable fingerprint for the machine).
  2. POST /api/Licenses with type: "NodeLocked", hardwareId populated, issuedTo, softwareReleaseId, optional expiration.
  3. Generate/download license.bin; deliver alongside the license key.
  4. For pending-bind workflows, operators use GET /api/Licenses/pending-bindings and POST .../confirm-binding / reject-binding / reset-binding as exposed on your host under /api/Licenses/....

REST API highlights

  • POST /api/Licenses/validate — include hardware context in validationParams / forms as required by your integration (server evaluates mismatch).
  • GET /api/Licenses/validate/{licenseKey}?hardwareId=... — simple query variant.
  • POST /api/Licenses/{licenseId}/unbind-device — administrative unbind when hardware changes legitimately.

SDK integration

You do not pass HWID as a separate argument to ValidateAsync() — the client uses the configured hardware identifier provider internally. Supply correct LicenseFilePath, PublicKey, and LicenseKey; optional IHardwareIdentifier only for advanced/testing scenarios.

using LicenPro.SDK;
using LicenPro.SDK.Enums;

await using var client = new LicenseClient(new LicenseClientOptions {
    LicenseFilePath = "license.bin",
    PublicKey = publicKeyBase64,
    LicenseKey = nodeLockedKey,
    ExpectedLicenseType = LicenseType.NodeLocked
});

var result = await client.ValidateAsync();

if (!result.IsValid &&
    (result.Status == LicenseValidationStatus.ValidationFailed
     || result.Status == LicenseValidationStatus.DeviceBlocked))
{
    // Hardware mismatch or blocked device
}

Offline: ValidateOfflineAsync verifies cryptographic binding in the file; policy may still require periodic online refresh for compliance.