授权

功能、授权层级与授权服务

本页是关于授权如何影响 Doconut 行为的运行时参考:每种授权状态允许的功能、功能如何被授予,以及如何在代码中检查这些信息。(关于加载授权,请参见 入门 → 授权设置。)

授权状态及其作用

状态是否可打开文档水印功能
完整(付费)授权(在其订阅/更新窗口内)是无已购买的 (Has* 标志)
临时授权(开发者/NFR — 评估授权,在到期日前)是无全部 — 全面授予(评估渠道)
已过期(临时授权已过期,或付费订阅已过期)是评估水印未授予任何功能
完全没有授权文件是评估水印未授予任何功能
已找到但被拒绝(签名无效、被篡改、列入黑名单,或构建版本高于授权的版本窗口)否 — LicenseException on every open——

两个值得内部化的后果:

  • 缺少授权并不等同于临时授权。 当没有授权文件时,页面会显示水印,且没有任何功能(搜索、批注、插件)被激活。完整且无水印的体验需要实际的 临时授权(获取一个)。
  • 只有被拒绝的授权会阻止打开。 日历/订阅到期会降级为水印渲染;但部署一个 高于 授权版本窗口的构建会被拒绝,并且 快速失败,抛出 LicenseException,因此你可以在部署时捕获,而不是悄悄地发布带水印的输出。该异常(来自 OpenDocumentAsync)携带 License.RejectionMessage 中的原因。

功能

Doconut 通过 功能 来控制可选功能。目前这些包括可选的 Converter 和 DICOM 插件以及内置的 Search 和 Annotation 功能,均由你的授权授予。基础查看器不是功能——它是前提条件,以 IsViewerLicensed 形式呈现:

csharp
bool viewerLicensed = lic.IsViewerLicensed; // non-TRIAL license present AND covering this build's version

整个管道使用的唯一门控是 IsCapabilityGranted:

csharp
bool searchGranted = lic.IsCapabilityGranted(LicenseCapability.Search);

其逻辑直接摘自实现:一个有效的(未过期)临时授权会授予 所有 功能——包括尚未拥有专用购买标志的功能;而真实的付费授权仅授予其 Has* 标志对应的功能,对未映射的功能采用 默认拒绝。 (旧版 TRIAL 类型文件 不是 权益——它被视为未授权:带水印,未授予任何功能。)

临时授权

普通的 Search 和 Annotation 直接使用其现有的功能。

临时(Developer/NFR)授权通过 ExpiryNote 标记,并携带硬性到期日期:

成员含义
IsTemporaryExpiryNote 标记存在(检测方式为标记是否存在——永不匹配标记文本,它是动态的)
ExpiryNote嵌入授权中的信息性文本
LicenseExpiry硬性到期日期(DateTime?)

到期语义因层级而异:临时授权仅在其 LicenseExpiry 日期 到期(其订阅窗口被忽略;缺少日期的临时授权视为已过期,作为安全措施)。其他所有授权在其订阅/更新窗口日期到期。

IDoconutLicenseService 参考

注入 IDoconutLicenseService(命名空间 Doconut.Core.Interfaces;以单例方式注册——授权在启动时解析一次):

成员含义
License完整的 DoconutLicenseInfo 快照(见下)
IsTrial旧版 TRIAL 类型文件(视为未授权——不是权益)
IsTemporary / ExpiryNote / LicenseExpiry临时授权标记
IsExpired根据上述层级规则已过期
IsVersionValid此构建位于授权的支持窗口内
IsViewerLicensed找到非 TRIAL 文件 且 版本受支持——基础前提
IsCapabilityGranted(cap)唯一的功能门控
HasSearch HasAnnotation HasConverter HasDicom按功能的购买标志发布——使用 IsCapabilityGranted 获取考虑临时授权的答案
IsValidForDomain(host)主机覆盖;V4 授权使用通配符 *.*
LicenseRejectionReason非空 ⇒ 打开被阻止,并显示此消息

DoconutLicenseInfo 提供面向管理员面板的友好显示快照:Owner、Email、LicenseType、Domain、IsLicenseFileFound、IsVersionValid、IsTrial、IsExpired、Has* 标志、临时授权字段以及 RejectionMessage。

csharp
// Feature-flag your UI from the same source of truth the SDK uses
app.MapGet("/api/features", (IDoconutLicenseService lic) => Results.Ok(new
{
    viewer     = lic.IsViewerLicensed || lic.IsTemporary,
    search     = lic.IsCapabilityGranted(LicenseCapability.Search),
    annotation = lic.IsCapabilityGranted(LicenseCapability.Annotation),
    conversion = lic.HasConverter,
    dicom      = lic.HasDicom,
}));

健康检查

AddDoconut() 注册一个 "doconut" 健康检查,通过标准的 ASP.NET Core 机制报告授权/到期状态:

csharp
app.MapHealthChecks("/health");

将其接入监控后,临近到期的订阅会触发警报,而不是生成支持工单。

版本升级

授权覆盖一个 版本窗口。将 NuGet 包更新到 高于 该窗口的构建会使授权对该构建失效:IsVersionValid 变为 false,并且 打开被阻止,抛出 LicenseException(原因在 License.RejectionMessage 中)——有意快速失败,以便在部署时捕获过时或未授权的构建,而不是悄悄地在生产输出上加水印。续订授权,替换 .lic 文件,并重启应用,使 AddDoconut() 加载新授权。

此页面对您有帮助吗?