using Admin.NET.Core; namespace Admin.NET.Plugin.AiDOP.Infrastructure; /// /// S8 可信作用域:租户一律由服务端从认证身份解析, /// 客户端传入的 tenantId / factoryId / body.TenantId / body.FactoryId 不承担任何安全边界作用。 /// /// S8-TENANT-ONLY-BATCH6:Factory 已退出作用域。 /// 原实现要在租户内解析出唯一的「工厂组织」,并在 0 个或多于 1 个时**直接抛异常** —— /// 于是零工厂 / 多工厂租户连异常列表都打不开,而工厂在 S8 里本就不决定任何数据归属。 /// 该解析连同 Type='501' 工厂组织查询一并删除:S8 不再需要知道"当前是哪个工厂"。 /// /// 安全边界没有放松:租户仍只信认证后的 JWT /// (),绝不接受 query 里的 tenantId。 /// 去掉的是一个从不提供隔离、却经常制造故障的维度。 /// public sealed record S8TrustedScope(long TenantId) { /// /// 历史兼容:仍需往 factory_id 列写值的旧代码用它,语义是「租户级、无工厂」。 /// /// 刻意不叫 FactoryId —— 那个名字会让人以为它还是个作用域。 /// 它只是一个写入 legacy 列的占位值,任何查询谓词都不得使用它。 /// public long LegacyFactoryId => S8ConfigScope.GlobalFactoryId; } /// /// S8 租户可信作用域解析器。只解析租户,不再解析工厂。 /// public sealed class S8TrustedScopeResolver : ITransient { private readonly UserManager _userManager; public S8TrustedScopeResolver(UserManager userManager) => _userManager = userManager; /// 解析当前登录身份的 S8 可信作用域;租户无法确定时抛业务异常,绝不回落默认值。 public Task ResolveAsync() => Task.FromResult(new S8TrustedScope(AidopTenantScope.ResolveOrThrow(_userManager))); }