我很想知道是否有任何标准或资源可以推荐用于在C#中开发许可证模型?
答案 0 :(得分:21)
在C#中,您可以使用Microsoft提供的Licensing class。可以通过链接获得样本。
基本上,您创建一个继承自LicenseProvider的类并键入
[LicenseProvider(typeof(MyControlLicenseProvider))]
作为您希望获得许可的类的属性。在您的实现(MyControlLicenseProvider
)中,您可以编写适当的方法来验证您的需求的许可证,然后进行代码调用
License license = LicenseManager.Validate(typeof(MyControl), this);
如果许可证不为空,则您的应用程序/控件已获得许可。
正如格雷斯塔爵士所说,没有一个系统是万无一失的,而且具备所需技能的人可以围绕你的验证进行自我设计。不要花费太多时间来实施岩石硬系统,但也不要轻易绕过它们。 : - )
使用SHA之类的散列或其中一个MD散列函数并为其提供一些关键数据,可用于创建简单的验证检查。您的验证方法可以在
之类的内容中执行某些操作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();
}
此方法返回自定义License,例如,其中包含有关许可的属性,如许可用完时的DateTime。设置它不应该花很长时间,它适用于WinForms和ASP.NET站点,并且会阻止(不保证暗示)一个简单的尝试来打破你的许可。
答案 1 :(得分:1)
我从来没有遇到像这样的标准。我个人所做的就是创建一个记录或类似的东西,其中包含许可证的所有信息,以及在输入产品密钥之前可用的功能,以及试用之前多长时间或任何到期时间(这可能会很棘手)我想与系统日期进行比较,因为这可以由用户更改。然后,您希望加密此记录(可能通过对其进行盐析和散列),以便只有在输入特定产品密钥时才能解锁这些功能。您也可能想要随机生成所述密钥,尽管我会以特定格式执行此操作,以便用户在获得产品密钥时始终可以识别产品密钥,并且不要将其与发票编号或其他任何内容混淆。
记住,没有一个系统是万无一失的,某个操作系统上的某个人会以某种方式找到方法。这可能是我从未遇到任何标准的原因,因为没有方法是完全安全的。你只需要尽力而为。