公网宿主(ZR.Front.WebApi)
2026/10/18大约 3 分钟
公网宿主(ZR.Front.WebApi) 会员
自某版本起,解决方案将 C 端接口拆分到独立的公网宿主 ZR.Front.WebApi:公网只暴露 [PublicApi] 标记的 C 端接口,后台管理接口公网不可达;内网宿主 ZR.Admin.WebApi 不再注册 C 端接口。
一、两个宿主的职责划分
内网宿主 ZR.Admin.WebApi | 公网宿主 ZR.Front.WebApi | |
|---|---|---|
| 端口 | 8888 | 8889 |
| 接口范围 | 后台管理接口(不含 C 端) | 仅 [PublicApi] 标记的 C 端接口 |
| 鉴权 | 后台 JWT(Authorization) | 会员令牌(mall-token),不注册后台鉴权管线 |
| 会员令牌 | 不签发、不校验 | 唯一签发与校验方 |
| 雪花 workId | 1 | 2(必须与内网宿主不同,否则生成重复 ID) |
| 启动脚本 | bat/run.bat / bat/startup.bat | bat/run-mall.bat / bat/watch-mall.bat |
数据库配置(dbConfigs)必须与内网宿主指向同一套库;多租户配置(UseTenant)两边必须一致。
二、[PublicApi] 白名单机制
- 特性定义在
Infrastructure/Attribute/PublicApiAttribute.cs,标注在控制器类上; - 公网宿主通过
PublicControllerFeatureProvider过滤控制器,只有带[PublicApi]的类才会注册为路由,其余后台控制器(用户、角色、菜单等)公网完全不可达; - 公网宿主不注册后台鉴权(无
AddJwt/UseAuthentication/JwtAuthMiddleware),也不持有后台签名密钥,无法校验或伪造后台令牌;共享工具类JwtUtil已支持优雅降级,请求即便误带Authorization头也不会抛异常。
三、必须关注的配置(appsettings.json)
//会员令牌配置(仅公网宿主使用)
"MemberJwt": {
"Issuer": "ZRAdmin.Member", //C端会员令牌签发者(与后台隔离)
"Audience": "ZRAdmin.Member.App", //会员令牌使用方
"Expire": 20160, //过期时间(分),默认 14 天
"SecretKey": "" //⚠️ 禁止明文提交,见下文
},
//微信支付V3:公网宿主负责商城下单与支付回调
"WechatPay": {
"Enabled": false,
"NotifyUrl": "https://your-front-domain.com/shopping/front/order/wechat/notify", //回调必须指向本宿主(公网 HTTPS)
//...商户号、API证书、APIv3密钥、小程序 AppId/Secret 等
},
//跨域地址(C 端 H5 站点域名)
"corsUrls": ["http://localhost:8886"],
//多租户:SaaS 部署下匿名 C 端请求按域名定位租户库
"TenantSettings": {
"UseTenant": 0,
"RootDomains": ["zradmin.net"], //租户根域名
"ReservedSubDomains": ["www", "admin", "api", "doc", "shop", "front"] //保留子域名,公网商城域名必须列入
},
//开发联调:true 时验证码接口返回 devCode,生产必须 false
"MockSms": { "Enabled": false }
MemberJwt:SecretKey 必须显式配置
- 会员令牌密钥不再从后台
JwtSettings:SecretKey派生(派生后缀是源码公开常量,会被用来伪造会员身份); - 未配置时拒绝签发、并拒绝识别任何会员身份(fail-closed,不会静默退化);
- 注入方式:
appsettings.Development.json/appsettings.Production.json(均已被 gitignore)或环境变量MemberJwt__SecretKey; - 启动时会自检并在日志输出 Warning 提醒。
四、部署依赖与要点
| 项 | 说明 |
|---|---|
ip2region_v4.xdb | IP 归属地库,随发布附带在宿主目录,缺失启动即抛 FileNotFoundException |
iprate.json | IP 限流规则,公网宿主必须启用限流,规则文件在 Program.cs 显式加载 |
Upload 配置节 | AddRequestLimit 读取 upload:requestLimitSize,缺失会限制所有请求体 |
ALIYUN_OSS / S3 | IOssProvider 注册时会构造并读取,需保留配置节点(当前不暴露上传接口) |
| HTTPS | 微信支付回调 NotifyUrl 要求公网 HTTPS,且路由不可改 |
| 日志 | NLog.config,输出到宿主目录 logs/ |
五、C 端接口清单
会员与订单接口(基础路径 /front/member,鉴权请求头 mall-token)详见 商城模块。
新增 C 端接口的规范
新控制器需标注 [PublicApi](类级别),会员鉴权使用 [MemberAuthorize] 特性;未标注 [PublicApi] 的接口公网宿主不会注册。
