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