Restricciones de la licencia
La sección Restricciones de una plantilla de Babel Licensing permite definir limitaciones concretas sobre el uso de las licencias. Estas restricciones dan un control detallado sobre el comportamiento de la licencia, con el que puede implementar distintos modelos de licencia y hacer cumplir las condiciones de uso. Babel Licensing ofrece varios tipos de restricción integrados, además de la posibilidad de crear restricciones personalizadas.
Descripción general de las restricciones de la licencia
Las restricciones de la licencia son condiciones exigibles que determinan cómo, cuándo y dónde se puede usar su software con una licencia concreta. Cada tipo de restricción se ocupa de un aspecto específico del control de la licencia, desde el uso limitado en el tiempo hasta la vinculación al hardware. En una misma plantilla de licencia se pueden combinar varias restricciones para crear modelos de licencia sofisticados y adaptados a sus requisitos.
Cuando una licencia tiene varias restricciones, TODAS deben validarse individualmente para que la licencia se considere válida. Basta con que una sola restricción no supere la validación para que falle todo el proceso de validación de la licencia. Así se pueden crear condiciones de licencia muy específicas, en las que todas las limitaciones definidas deben cumplirse a la vez.
Restricción beta
La restricción beta está pensada para el software en versión preliminar: marca las licencias con información que indica que el software está en fase beta.
Propiedades principales:
- Tipo de compilación: especifica el tipo de compilación (por ejemplo, «Alpha», «Beta», «RC») para indicar la fase de desarrollo del software.
- Cambios recientes: un campo de texto en el que puede documentar los cambios o las funciones propios de esta versión beta.
Casos de uso:
- Distribuir versiones de acceso anticipado a probadores o a clientes seleccionados
- Programas beta de duración limitada antes del lanzamiento definitivo del producto
- Limitar la responsabilidad al identificar claramente el software como versión preliminar
Ejemplo de implementación:
if (license.Restrictions.OfType<BetaRestriction>().Any())
{
// Show beta warning dialog
// Enable telemetry and crash reporting
}Restricción de hardware
La restricción de hardware vincula una licencia a un hardware concreto, lo que impide su uso no autorizado en otros equipos. Para ello se usa una clave de hardware generada a partir de las características únicas del equipo de destino.
Propiedades principales:
- Clave de hardware: un identificador único generado a partir de los componentes de hardware del equipo (puede estar vacío en la plantilla y rellenarse durante la activación de la licencia).
- Datos: datos adicionales que sirven para almacenar información específica del hardware.
Casos de uso:
- Licencias perpetuas para un solo equipo
- Impedir que una licencia se comparta entre varios dispositivos
- Entornos de alta seguridad en los que el software debe estar vinculado a un hardware autorizado
Nota: cuando se usan licencias de activación, la restricción de hardware se aplica automáticamente durante el proceso de activación, porque la licencia queda vinculada al equipo concreto mediante su id de hardware. Por tanto, no es necesario añadir explícitamente una restricción de hardware a las plantillas de licencia que usan la modalidad de licencia de activación. El propio proceso de activación se encarga de la vinculación al hardware.
Restricción de prueba
La restricción de prueba limita el uso del software por tiempo o por parámetros de ejecución, lo que la hace idónea para ofrecer versiones de prueba gratuitas de su software.
Propiedades principales:
- Días hasta la caducidad: número de días durante los que la prueba es válida después del primer uso.
- Instancias simultáneas: número máximo de instancias simultáneas permitidas.
- Número de ejecuciones: número máximo total de ejecuciones de la aplicación permitidas.
- Tiempo de ejecución: tiempo máximo que la aplicación puede ejecutarse en cada sesión.
- Términos: términos y condiciones especiales que se aplican a la licencia de prueba.
Casos de uso:
- Versiones de evaluación de duración limitada
- Versiones de prueba con funciones limitadas
- Versiones de demostración con un número de usos limitado
- Implementación del modelo freemium
Ejemplo de implementación:
var trial = license.Restrictions.OfType<TrialRestriction>().FirstOrDefault();
if (trial != null)
{
if (trial.IsExpired())
{
// Show trial expiration message
// Prompt for license purchase
}
else
{
// Show remaining trial period
// Log trial usage
}
}Restricción de dominio
La restricción de dominio limita el uso de la licencia a un dominio de red concreto, de modo que el software solo se puede usar dentro de los límites autorizados de la organización.
Propiedades principales:
- Dominio: el nombre del dominio de red en el que la licencia es válida (por ejemplo, «example.com»).
- Rol: identificador de rol opcional dentro del dominio (por ejemplo, «developer», «admin»).
Casos de uso:
- Licencias corporativas para organizaciones concretas
- Limitar el uso del software a las redes corporativas autorizadas
- Términos de licencia distintos para distintas unidades de la organización
Restricción de uso
La restricción de uso define el entorno en el que se permite ejecutar la aplicación, lo que da control sobre los escenarios de despliegue y los contextos de ejecución.
Propiedades principales:
- Uso: identifica el entorno o el contexto de uso permitido.
- Puede ejecutarse en un entorno virtual: cuando es true, permite que el software se ejecute en entornos virtualizados.
- Lista de procesos: una lista de procesos que deben, o no deben, estar en ejecución para que la licencia sea válida.
Casos de uso:
- Impedir la ejecución en máquinas virtuales en las aplicaciones sensibles en materia de seguridad
- Limitar el software a entornos concretos (desarrollo, preproducción, producción)
- Exigir o prohibir la presencia de determinados procesos complementarios
Restricciones personalizadas
Además de las restricciones integradas, Babel Licensing permite crear restricciones personalizadas para atender requisitos de licencia propios de su aplicación. Las restricciones personalizadas son extensiones potentes con las que puede implementar una lógica de validación especializada, adaptada a sus necesidades técnicas y de negocio.
Implementar restricciones personalizadas
Para crear una restricción personalizada, debe implementar una clase que herede de Restriction e implemente la interfaz ILicenseSerializable. Así tiene un control completo tanto de la lógica de validación como de la forma en que la restricción se serializa en el archivo de licencia.
Componentes principales de una restricción personalizada:
- Propiedad Name: un identificador único del tipo de restricción.
- Propiedades personalizadas: propiedades específicas de la funcionalidad de la restricción.
- Lógica de validación: código personalizado que determina si la licencia es válida según sus criterios.
- Métodos de serialización: métodos para leer y escribir los datos de la restricción en formato XML o binario.
Ejemplo: restricción de requisitos de memoria
Este es un ejemplo de una restricción personalizada que valida si un equipo cumple los requisitos mínimos de memoria.
/// <summary>
/// A license restriction that limits usage based on the physical memory (RAM)
/// of the system.
/// </summary>
class MemoryRestriction : Restriction, ILicenseSerializable
{
/// <summary>
/// Gets the name of the restriction.
/// </summary>
public override string Name => "Memory";
/// <summary>
/// Gets or sets the minimum total memory required in megabytes.
/// </summary>
public long TotalMemory { get; set; }
/// <summary>
/// Initializes a new instance of the <see cref="MemoryRestriction"/> class.
/// </summary>
public MemoryRestriction()
{
}
/// <summary>
/// Validates that the system has at least the required amount of physical memory.
/// </summary>
/// <param name="context">The license context.</param>
/// <param name="type">The type being validated.</param>
/// <param name="instance">The instance being validated.</param>
/// <returns>A <see cref="ValidationResult"/> indicating whether validation was successful.</returns>
public override ValidationResult Validate(ILicenseContext context, Type type, object instance)
{
ISystemInformation sys = (ISystemInformation)context.GetService(typeof(ISystemInformation));
// Cannot run on this machine
long totalMem = ToMegabytes(sys.TotalPhysicalMemory);
if (totalMem < TotalMemory)
return ValidationResult.Invalid;
return base.Validate(context, type, instance);
}
/// <summary>
/// Converts bytes to megabytes.
/// </summary>
/// <param name="bytes">The number of bytes to convert.</param>
/// <returns>The equivalent value in megabytes.</returns>
private static long ToMegabytes(long bytes)
{
return bytes / 1024 / 1024;
}
/// <summary>
/// Reads the memory restriction data from the specified state.
/// </summary>
/// <param name="state">The state object, which can be either an <see cref="XmlReader"/> or a <see cref="BinaryReader"/>.</param>
public void Read(object state)
{
if (state is XmlReader xmlReader)
{
xmlReader.MoveToContent();
string? totalMemory = xmlReader.GetAttribute("totalMemory");
if (totalMemory != null)
TotalMemory = XmlConvert.ToInt64(totalMemory);
bool isEmptyElement = xmlReader.IsEmptyElement;
xmlReader.ReadStartElement();
if (!isEmptyElement)
xmlReader.ReadEndElement();
}
else if (state is BinaryReader binaryReader)
{
TotalMemory = binaryReader.ReadInt32();
}
}
/// <summary>
/// Writes the memory restriction data to the specified state.
/// </summary>
/// <param name="state">The state object, which can be either an <see cref="XmlWriter"/> or a <see cref="BinaryWriter"/>.</param>
public void Write(object state)
{
if (state is XmlWriter)
{
XmlWriter writer = (XmlWriter)state;
if (TotalMemory != 0)
writer.WriteAttributeString("totalMemory", XmlConvert.ToString(TotalMemory));
}
else if (state is BinaryWriter)
{
BinaryWriter writer = (BinaryWriter)state;
writer.Write(TotalMemory);
}
}
}El proyecto de ejemplo completo está disponible en GitHub:
git clone https://github.com/babelfornet/custom_license_restrictions.gitUsar restricciones personalizadas al crear licencias
Una vez definida la clase de la restricción personalizada, puede usarla al generar licencias:
// Create a digital signer
RSASignature signer = RSASignature.CreateFromKeyFile("Keys.snk");
// Requires a minimum of 4GB RAM to validate
int totalMemory = 4096;
var license = new XmlLicense()
.WithUniqueId()
.ForProduct("Product", "1.0.0.0")
.LicensedTo("ACME", "devs@acme.com")
.WithRestrictions(new MemoryRestriction(totalMemory))
.SignWith(signer);
license.Save("Product.licenses");Casos de uso de las restricciones personalizadas
Las restricciones personalizadas pueden atender una gran variedad de requisitos de licencia especializados:
- Requisitos de hardware: garantizar que el software solo se ejecute en equipos que cumplan unas especificaciones mínimas.
- Configuración de red: validar configuraciones de red concretas o requisitos de conectividad.
- Restricciones por zona horaria: limitar el uso del software a regiones geográficas concretas según la zona horaria.
- Coexistencia de aplicaciones: verificar que están instaladas las aplicaciones complementarias necesarias.
- Validación del motor de base de datos: garantizar que hay sistemas de base de datos compatibles.
- Detección de entornos en la nube: aplicar reglas especiales a los despliegues alojados en la nube.
- Reglas de negocio personalizadas: implementar reglas de licencia específicas de un sector o de una organización.
Restricciones personalizadas y plantillas de licencia
Las restricciones personalizadas se integran sin dificultad en el sistema de plantillas de Babel Licensing, lo que permite guardar y reutilizar configuraciones de licencia que incluyen su lógica de validación personalizada. Cuando se guardan como parte de una plantilla de licencia en el Babel Licensing Service, estas restricciones personalizadas se convierten en componentes reutilizables que se pueden aplicar de forma coherente en muchas licencias.
Almacenar restricciones personalizadas en plantillas de licencia
Una vez implementada una restricción personalizada, puede incorporarla a una plantilla de licencia mediante el Babel Licensing Service:
- Cree la licencia con la restricción personalizada, como se muestra en el ejemplo anterior.
- Guarde esta licencia como plantilla en la base de datos de Babel Licensing.
- La plantilla, con la restricción personalizada incluida, queda disponible para generar licencias nuevas.
Ventajas de las restricciones personalizadas basadas en plantillas
Almacenar las restricciones personalizadas en plantillas de licencia tiene varias ventajas:
- Coherencia: todas las licencias generadas a partir de la plantilla aplican las mismas reglas de validación personalizadas, lo que mantiene la coherencia de su estrategia de licencias.
- Gestión centralizada: las restricciones personalizadas se gestionan desde un único lugar del Babel Licensing Service, lo que facilita actualizar o modificar las reglas de licencia.
- Generación de licencias simplificada: se generan licencias nuevas con restricciones personalizadas complejas sin tener que volver a implementar cada vez la lógica de validación.
- Control de versiones y seguimiento: se lleva el control de las distintas versiones de las restricciones personalizadas a medida que evolucionan los requisitos de licencia.
- Integración con los flujos de trabajo de licencias: las restricciones personalizadas se incorporan a los procesos de licencia existentes, como la activación de licencias, las licencias flotantes o las licencias de archivo.
Flujo de trabajo de ejemplo
Este es un flujo de trabajo habitual para usar restricciones personalizadas en el sistema de plantillas del Babel Licensing Service:
-
Desarrollo: cree y pruebe la clase de la restricción personalizada en su entorno de desarrollo.
-
Creación de la plantilla: prepare una licencia con la restricción personalizada y guárdela como plantilla:
var licenseKey = new XmlLicense() .WithUniqueId() .ForProduct("Product", "1.0.0.0") .WithRestrictions(new MemoryRestriction(4096)) .SignWith(signer) .ToReadableString(); // Store licenseKey in Babel Licensing Service -
Generación de licencias: use la plantilla para generar licencias concretas para los clientes.
-
Distribución: distribuya la licencia generada al cliente con el método de entrega que prefiera (descarga directa, correo electrónico, código de activación, etc.).
-
Validación: cuando el cliente usa su aplicación, la lógica de validación de la restricción personalizada se ejecuta como parte del proceso de validación de la licencia.
Implementar restricciones personalizadas compatibles con las plantillas
Para que las restricciones personalizadas funcionen bien en el sistema de plantillas, tenga en cuenta estas pautas de implementación:
- Flexibilidad de los parámetros: diseñe la clase de la restricción personalizada de modo que admita tanto la inicialización con parámetros (para la creación mediante código) como la inicialización sin parámetros (para la creación a partir de plantillas).
- Serialización XML: implemente correctamente la interfaz
IXmlSerializablepara que la configuración de la restricción personalizada se pueda guardar en las plantillas de licencia y cargar desde ellas. - Compatibilidad con versiones anteriores: mantenga la compatibilidad con versiones anteriores al actualizar las restricciones personalizadas, para que las plantillas y las licencias existentes sigan funcionando.
- Control de errores: implemente un control de errores sólido en la lógica de serialización y en la de validación, para evitar problemas cuando la restricción personalizada se use en una plantilla.
Integración con las funciones del Babel Licensing Service
Las restricciones personalizadas almacenadas en plantillas pueden aprovechar todas las funciones del Babel Licensing Service:
- Licencias de activación: aplique restricciones personalizadas a las licencias que requieren activación, para añadir su validación especializada al proceso de activación.
- Licencias flotantes: use restricciones personalizadas con las licencias flotantes para añadir criterios de validación especializados al uso simultáneo de las licencias.
- Licencias de archivo: incluya restricciones personalizadas en las licencias de archivo para los escenarios de validación sin conexión.
Al incorporar restricciones personalizadas a las plantillas de licencia del Babel Licensing Service, se crea un sistema de licencias potente, flexible y fácil de mantener, capaz de atender incluso los requisitos de licencia más singulares y especializados sin renunciar a las ventajas de la gestión centralizada de licencias.
Prácticas recomendadas para las restricciones personalizadas
- Mantener rápida la validación: el código de validación de una restricción personalizada se ejecuta durante la comprobación de la licencia, así que procure que sea eficiente.
- Controlar las excepciones: asegúrese de que el código de validación controle correctamente las excepciones, para evitar cierres inesperados de la aplicación.
- Dar información clara: cuando la validación falle, devuelva información útil sobre el motivo del fallo.
- Proteger la lógica confidencial: cualquier lógica de validación confidencial de la restricción personalizada puede ser objeto de ingeniería inversa; valore ofuscar el código crítico.
- Probar a fondo: pruebe las restricciones personalizadas en distintos entornos para comprobar que se comportan de forma coherente.
- Documentar con detalle: documente las restricciones personalizadas tanto para el desarrollo interno como para los materiales destinados a los clientes.
Las restricciones personalizadas amplían las capacidades de Babel Licensing para atender requisitos de licencia singulares, y ofrecen una solución de licencias flexible y potente, adaptada a sus necesidades. Estas reglas de validación especializadas permiten implementar exactamente el modelo de licencia que su aplicación requiere, con un control completo sobre cómo se licencia y se usa su software.
Combinar restricciones
Una función destacada de Babel Licensing es la posibilidad de combinar varias restricciones para crear modelos de licencia sofisticados. Por ejemplo, puede combinar:
- Prueba + Hardware: una prueba de duración limitada vinculada a un equipo concreto
- Dominio + Uso: una licencia válida solo dentro de un dominio corporativo y en entornos no virtuales
- Beta + Personalizada: una licencia beta con restricciones personalizadas para escenarios de prueba concretos
Cuando se aplican varias restricciones, todas deben cumplirse para que la licencia se considere válida. Esto permite controlar con precisión cómo se licencia y se usa su software.
Prácticas recomendadas para usar las restricciones
- Empezar por lo sencillo: comience con las restricciones mínimas necesarias y añada más a medida que evolucionen sus necesidades de licencia.
- Tener en cuenta la experiencia del usuario: busque el equilibrio entre seguridad y facilidad de uso. Las licencias demasiado restrictivas pueden frustrar a los usuarios legítimos.
- Dar información clara: cuando una restricción haga fallar la validación de la licencia, asegúrese de que su aplicación explique con claridad por qué la licencia no es válida.
- Probar a fondo: pruebe todas las combinaciones de restricciones para comprobar que funcionan como se espera en distintos escenarios.
- Documentar para los usuarios finales: documente con claridad las restricciones aplicadas a cada tipo de licencia, para que los clientes entiendan las limitaciones.
- Prever una degradación gradual: cuando sea posible, valore permitir una funcionalidad limitada en lugar de que la aplicación falle por completo cuando no se cumplan determinadas restricciones.
El uso eficaz de las restricciones de la licencia en sus plantillas crea un sistema de licencias flexible, que protege su propiedad intelectual y da a los clientes el acceso que corresponde a su nivel de licencia. Estas restricciones son la base para implementar modelos de licencia sofisticados que equilibran seguridad y facilidad de uso, de modo que su software se use conforme a sus términos de licencia y los usuarios legítimos tengan una experiencia fluida.