Tech Blog

Sharing .NET, Blazor, and full-stack development insights

24 articles Filtering by: EasyAdminBlazor
Original 2026-10-01 887

EasyAdminBlazor 审批并发控制:两个人同时审批为什么只能成功一个?

EasyAdminBlazor审批并发控制采用条件更新(乐观锁)而非加锁。核心是两步原子操作:业务状态用“状态+级次”条件更新,审批节点用“当前节点+待处理+审批人是我”认领,affected <= 0 即代表有人抢先,直接返回冲突。或签时同节点其余待处理记录置 Skipped,历史只新增不改写。两步在同一事务内完成,避免半成功状态。

Read More
Original 2026-10-01 670

EasyAdminBlazor 审批模块实战:从提交、审批到最终完成

EasyAdminBlazor审批模块采用“状态机+审批记录表”方案,专注固定 2~3 级串联审批。五步接入:装包注册流程、实体换基类、页面加审批选项卡、配审批人(支持部门/角色/指定人/表单字段)、跑通提交与审批。审批记录表同时承载流水、待办索引与通知目标,一张表加两个索引支撑全部查询。

Read More
Original 2026-09-30 683

EasyAdminBlazor 多租户 Redis 隔离:数据库隔离了,缓存还可能串租户?

EasyAdminBlazor多租户缓存隔离的核心方案是统一前缀 tenant:{code}:。数据库虽已隔离,但内存缓存和 Redis 是跨租户共享的,不加前缀会导致系统配置、权限菜单、字典选择器、审批流程配置乃至分布式锁全部串租户。框架为所有业务键统一拼前缀,无租户时回退 tenant:main:,并用测试锁定行为。唯一例外是在线状态键为全局共享,需要隔离时需自行调整。

Read More
Original 2026-09-30 865

EasyAdminBlazor 动态创建租户数据库:AutoSyncStructure 到底做了什么?

EasyAdminBlazor通过 AutoSyncStructure 实现租户数据库动态创建:新租户保存后,自动构建 FreeSql 实例并生成全部表结构,无需人工脚本。随后幂等初始化系统配置、管理员角色与账号(默认密码为租户编码+123),并递归同步菜单至租户库。单进程内用锁与双重检查保证并发安全,多实例需分布式锁配合。

Read More
Original 2026-09-29 717

EasyAdminBlazor 多租户源码解析:为什么采用独立数据库隔离?

EasyAdminBlazor的多租户实现采用独立数据库隔离,而非 TenantId 行级方案。核心链路四步走:按请求 Host 在主库 SysTenant 表匹配租户,每请求只解析一次;AdminContext.Orm 根据解析结果返回主库或租户库的 FreeSql 实例;数据库物理隔离,文件按租户编码分目录,缓存加租户前缀;租户编码必须过白名单正则,防止路径穿越与注入。独立库的代价是新租户建表必须自动化,这正是 AutoSyncStructure 的用武之地。

Read More
Original 2026-09-28 702

ASP.NET Core 远程图片下载为什么会有 SSRF 风险?EasyAdminBlazor 的完整防护实践

本文以 EasyAdminBlazor 2.3.0 为例,剖析远程图片下载的 SSRF 风险与完整防护:仅校验域名不够,Content-Type 可伪造、存在 DNS Rebinding、重定向绕过和协议降级。方案分七层——协议/主机/字面 IP 校验、DNS 全公网校验、禁止自动重定向逐跳校验、ConnectCallback 连接前锁定 IP、双重大小限制边读边落盘、扩展名+Magic Number+ImageSharp 三重内容校验、临时文件原子移动加下载授权,并用 SsrfTests 锁定攻击面。

Read More
Original 2026-09-28 899

EasyAdminBlazor 文件上传源码解析:从浏览器到服务器到底发生了什么?

这篇文章详解了 EasyAdminBlazor 中文件上传的完整链路:从组件选文件、FileService 的六道校验(扩展名白名单/黑名单、大小、Magic Number、路径规范化、重名处理、落盘),到 ImageSharp 图片解码校验与 WebP 转换,再到 SysFile 落库、私有文件五步授权下载和删除时的路径安全校验,最后给出配置项、测试覆盖与常见问题速查。

Read More