安全与部署
将 FormPlatform 作为具有受保护密钥、HTTPS 和运行防护的私有 .NET 10 服务部署。
安全配置与生产部署
生产环境的连接字符串、OAuth client secret、SMTP 密码、支付密钥、VAPID 私钥、DNN SSO 密钥和 S3 凭据都不得提交到 `appsettings.json`。本地开发用 `dotnet user-secrets`;Windows/IIS 使用受网站证书私钥保护的外部 secrets 文件;Linux/systemd 使用 credential 或仅运行帐号可读的秘密文件。
配置优先级
应用基础 JSON 只包含无敏感默认值。环境变量、User Secrets 和外部 secrets 文件覆盖基础 JSON。层级环境变量使用双下划线,例如:
ManagementDatabase__ConnectionString
Media__S3__AccessKey
Media__S3__SecretKey
RespondentExternalAuthentication__Google__ClientSecret
保护后的 Windows secrets 文件由安装程序或保护工具读取证书解密到内存;应用程序池身份需要读取证书私钥,但不应拥有整个部署目录或管理员帐户权限。
反向代理
公开 HTTPS 由 IIS/Nginx 终止时,Kestrel 仅监听 loopback。代理必须转发 `Host` 和 `X-Forwarded-Proto`。否则应用会把公开 HTTPS 请求误认为 HTTP,影响登录 cookie、安全重定向、许可证 origin、OAuth callback、支付 webhook 和 sitemap URL。
IIS 应用程序池使用 **No Managed Code**,安装 .NET 10 Hosting Bundle,写入 stdout 日志目录权限,并让池身份读取部署目录、运行时数据目录、必要的证书私钥和本地媒体目录。systemd 服务应使用专用低权限用户、固定 `WorkingDirectory`、显式 `ASPNETCORE_URLS` 和受控 credentials。
发布与验证
使用 standalone 打包脚本生成生产包;不要从正在运行的 Debug 输出复制文件。安装或升级后验证 `/healthz`、管理数据库连接、迁移日志、许可证、FormPlatform 登录、匿名/受访者流程、静态资产、反向代理子路径(若使用)和备份恢复流程。
English edition: SECURE_CONFIGURATION_AND_DEPLOYMENT.md.