LASAPlatform/Infrastructure/Auth/LicenseManqager.cs

187 lines
5.4 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

namespace Infrastructure.Auth;
using System;
using System.Security.Cryptography;
using System.Text;
using System.Text.Json;
/// <summary>
/// 授权信息模型
/// </summary>
public class LicenseInfo
{
/// <summary>
/// 授权用户
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 授权开始时间
/// </summary>
public DateTime StartTime { get; set; }
/// <summary>
/// 授权结束时间永久授权可设为DateTime.MaxValue
/// </summary>
public DateTime EndTime { get; set; }
/// <summary>
/// 授权类型(试用/正式/永久)
/// </summary>
public LicenseType LicenseType { get; set; }
/// <summary>
/// 硬件绑定信息(可选,用于防止多设备使用)
/// </summary>
public string HardwareId { get; set; }
}
/// <summary>
/// 授权类型
/// </summary>
public enum LicenseType
{
Trial, // 试用授权
Subscription, // 订阅授权
Permanent // 永久授权
}
/// <summary>
/// 授权管理核心类
/// </summary>
public class LicenseManager
{
// 加密密钥实际使用中建议替换为自己的密钥长度需为16/24/32字节
private readonly byte[] _key = Convert.FromBase64String("0TXis2sTDEnNAAe/6bYqG7xwapKQcXUlI+WwrMlKv5I=");
private readonly byte[] _iv = Convert.FromBase64String("UdDHCIRoqIn4shpJCGRUpg==");
/// <summary>
/// 生成授权文件
/// </summary>
/// <param name="info">授权信息</param>
/// <returns>加密后的授权字符串(可保存为文件)</returns>
public string GenerateLicense(LicenseInfo info)
{
// 序列化授权信息
string json = JsonSerializer.Serialize(info);
// 加密
return EncryptString(json);
}
/// <summary>
/// 验证授权有效性
/// </summary>
/// <param name="licenseString">加密的授权字符串</param>
/// <param name="errorMsg">验证失败时的错误信息</param>
/// <returns>是否有效</returns>
public bool ValidateLicense(string licenseString, out string errorMsg)
{
errorMsg = string.Empty;
try
{
// 解密授权信息
string json = DecryptString(licenseString);
var license = JsonSerializer.Deserialize<LicenseInfo>(json);
// 1. 检查硬件绑定(可选)
if (!string.IsNullOrEmpty(license.HardwareId) &&
license.HardwareId != GetHardwareId())
{
errorMsg = "授权与当前设备不匹配";
return false;
}
// 2. 检查时间有效性
DateTime now = DateTime.Now;
if (now < license.StartTime)
{
errorMsg = $"授权未生效,生效时间:{license.StartTime:yyyy-MM-dd}";
return false;
}
// 永久授权跳过结束时间检查
if (license.LicenseType != LicenseType.Permanent && now > license.EndTime)
{
errorMsg = $"授权已过期,过期时间:{license.EndTime:yyyy-MM-dd}";
return false;
}
return true;
}
catch (Exception ex)
{
errorMsg = $"授权验证失败:{ex.Message}";
return false;
}
}
/// <summary>
/// 获取授权剩余时间
/// </summary>
/// <param name="licenseString">加密的授权字符串</param>
/// <returns>剩余时间永久授权返回null</returns>
public TimeSpan? GetRemainingTime(string licenseString)
{
try
{
string json = DecryptString(licenseString);
var license = JsonSerializer.Deserialize<LicenseInfo>(json);
if (license.LicenseType == LicenseType.Permanent)
return null; // 永久授权无剩余时间
DateTime now = DateTime.Now;
if (now > license.EndTime)
return TimeSpan.Zero; // 已过期
return license.EndTime - now;
}
catch
{
return TimeSpan.Zero;
}
}
/// <summary>
/// 加密字符串
/// </summary>
private string EncryptString(string plainText)
{
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = _key;
aesAlg.IV = _iv;
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
byte[] encrypted = encryptor.TransformFinalBlock(Encoding.UTF8.GetBytes(plainText), 0, plainText.Length);
return Convert.ToBase64String(encrypted);
}
}
/// <summary>
/// 解密字符串
/// </summary>
private string DecryptString(string cipherText)
{
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = _key;
aesAlg.IV = _iv;
ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
byte[] cipherBytes = Convert.FromBase64String(cipherText);
byte[] decrypted = decryptor.TransformFinalBlock(cipherBytes, 0, cipherBytes.Length);
return Encoding.UTF8.GetString(decrypted);
}
}
/// <summary>
/// 获取硬件唯一标识(简化版,实际可增强)
/// </summary>
public string GetHardwareId()
{
// 实际应用中可结合CPU、硬盘、网卡等信息生成唯一ID
// 这里仅作为示例
return Environment.MachineName;
}
}