认证与授权
从 Discussions 的身份质询、声明转换和 SiteId 验证理解认证边界。
Discussions 在基础认证后补充论坛身份。用户编号回答“是谁”,SiteId 表达论坛业务范围,版主和可见性规则进一步约束“能做什么”。这些问题需要分层处理。
插件挂载身份扩展
来源:src/Zongsoft.Discussions.plugin(节选;上下文见源文件)。
<extension path="/Workbench/Security/Authentication/Challengers">
<object value="{static:Zongsoft.Discussions.Security.UserChallenger.Instance, Zongsoft.Discussions}" />
</extension>来源:src/Zongsoft.Discussions.plugin(节选;上下文见源文件)。
<extension path="/Workbench/Security/Authentication/Transformers">
<object value="{static:Zongsoft.Discussions.Security.UserIdentity+Transformer.Instance, Zongsoft.Discussions}" />
</extension>质询器读取或创建论坛用户资料,再向主体加入 Discussions 方案的身份;转换器把声明恢复为 UserIdentity。两者不是重复认证,承担不同阶段的工作。
用户资料成为声明
来源:src/Security/UserChallenger.cs(节选;上下文见源文件)。
private ClaimsIdentity Identity(UserProfile user)
{
var identity = user.Identity(UserIdentity.Scheme, "Zongsoft");
identity.SetClaim(nameof(UserProfile.SiteId), user.SiteId);
identity.SetClaim(nameof(UserProfile.Gender), user.Gender);
identity.SetClaim(nameof(UserProfile.Avatar), user.Avatar);
identity.SetClaim(nameof(UserProfile.Grade), user.Grade);
identity.SetClaim(nameof(UserProfile.TotalPosts), user.TotalPosts);
identity.SetClaim(nameof(UserProfile.TotalThreads), user.TotalThreads);
//进行其他声明定义
this.OnClaims(identity, user);
//返回新构建的身份
return identity;
}SiteId、Gender、Avatar、Grade 与统计信息都来自用户资料。身份快照不应视为永久实时业务数据;字段变更后何时刷新凭证,仍由安全宿主的有效期与更新策略决定。
当前论坛身份
来源:src/Security/UserIdentity.cs(节选;上下文见源文件)。
Scheme 是 Zongsoft.Discussions。只有建立该方案并注册转换器,当前模型才可用;普通 ClaimsPrincipal 或匿名访问并不自动带有这份身份。
站点范围与资源权限
DataValidator 对含 SiteId 的查询与写入约束当前站点,创建时还填写站点、创建人和时间。即使请求指定另一个 SiteId,也不能替代当前身份范围。认证初始化期间尚无论坛身份,因此相关查询必须由受控的认证流程调用。
站点隔离不等于版主权限,也不等于审核可见性。ThreadService 的业务动作、ForumService 的可见性条件、查询结果过滤器共同参与判断,见数据服务。
最后更新于