ASP.NET Core 8 Minimal API 服务端:Web 图形化后台生成配置,向安卓平板下发带 RSA 签名的配置,管理设备与版本。数据存于本地 SQLite,Windows Server 优先、兼容 Linux。
当前版本:v0.7.2(安装器修复版)
- 分级菜单后台:配置管理 / 设备管理 / 版本历史 / 系统设置 四个标签页,切换带淡入淡出过渡动画
- Web 图形化后台:首页、白/黑名单、教师快捷书签、轮询间隔、6 位平板管理密码、隐藏入口开关、截屏限制、可唤醒应用白名单、启动拍照开关
- 规则支持端口精确匹配:
host匹配任意端口、host:8080匹配指定端口;匹配不区分 http/https - 配置版本管理:发布、历史版本、一键回滚(回滚生成新版本号,终端必收到)
- 设备管理:显示每台设备当前 IP(自动更新)、在线/离线状态、最近启动拍照、最近输错密码拍照(最近 10 分钟内输错的设备行标红告警)
- 设备状态筛选:按 全部/在线/离线 过滤 + 按 ID/名称/IP 关键词搜索
- 设备列表自动刷新:支持关闭 / 1 秒 / 5 秒自动刷新设备状态
- 设备列表 CSV 导出:可勾选导出列、可按最后上线时间段筛选、可导出全部设备
- PIN 服务端校验:平板把密码 MD5 哈希发到服务端校验(不再本地比对),接口每设备每分钟限 5 次
- 登录安全加固(v0.7.1):登录接口每 IP 每分钟限 5 次(429);用户名不存在与密码错误返回完全一致的提示,杜绝用户名枚举
- PIN 哈希不再下发(v0.7.1):下发给 APP 的配置已剥离
admin_pin_hash(服务端版本库保留供校验),消除哈希被未授权获取后离线穷举的风险 - 登录令牌有效期(v0.7.1):Token 6 小时有效、每次请求滑动续期;过期令牌自动清理并要求重新登录
- 安装器修复(v0.7.2):取消勾选"开机自启动"时安装完也会立即启动服务(此前服务停在"已停止",后台和快捷方式都打不开);管理后台快捷方式改为真正的
.urlInternet 快捷方式(此前用CreateShortcut把网址写进.lnk,双击报「Windows 找不到文件」);卸载选"保留数据"时若临时目录被占用会中止卸载而不是误删数据库 - UA 安全校验(可选):系统设置中可开启,强制仅允许 OkHttp 客户端访问配置/注册/照片接口,非法客户端 403;默认关闭,待全部终端升级后开启
- 启动/输错前置拍照:服务端开关控制,拍照失败自动缓存补传;照片按天清理保留 7 天
- 配置 RSA-2048 签名,防止篡改;私钥仅存服务端
- 基于 NSIS 的 Windows 一键安装包:安装时可选端口/目录/开机自启/桌面快捷方式,注册为 Windows 服务;安装完成即启动服务并等待端口就绪("开机自启动"只影响下次开机)
- 端口可由程序目录下纯文本
campus.port覆盖(优先级:命令行/环境变量 > campus.port > 默认 8080)
dotnet run
# 默认监听 http://0.0.0.0:8080,可用 --urls "http://0.0.0.0:端口" 覆盖首次运行用浏览器打开 http://服务器IP:8080,进入初始化向导设置管理员账号与第一份配置。
├── Program.cs # 全部接口与启动逻辑
├── CampusBrowser.Server.csproj
├── Models/AppConfig.cs # 配置结构与请求模型
├── Services/
│ ├── Database.cs # SQLite:设置/版本/设备/令牌(全参数化查询)
│ ├── Security.cs # 后台密码 PBKDF2-SHA256、平板 PIN 哈希
│ └── Signer.cs # RSA-2048 配置签名
├── wwwroot/ # Web 管理后台(原生 HTML/JS,无需构建)
├── installer/ # NSIS 安装脚本与图标
├── docs/ # 架构与配置流程图
└── data/ # 运行后生成:campus.db(已 gitignore)
# 1. 发布
dotnet publish CampusBrowser.Server.csproj -c Release -r win-x64 \
--self-contained true -o installer/publish/win-x64
# 2. 用 NSIS 编译安装包(Linux 下 makensis 可用)
makensis -DAPP_VERSION=0.7.2 installer/campus-browser-server.nsi
# 输出 installer/CampusBrowserServer-setup.exe
# 若在中文 Windows 上编译,追加 -INPUTCHARSET UTF8,避免无 BOM 脚本按 ACP 解析导致中文乱码安装器特性:端口占用检测、升级从注册表回填上次目录、卸载询问是否保留数据(默认保留,不会误删数据库)、自动注册服务并配置失败自动重启、放行防火墙、安装完成即刻启动服务并等待端口就绪("开机自启动"只影响下次开机)、桌面/开始菜单为 .url 管理后台快捷方式(未勾选桌面快捷方式时不创建,并清理旧版残留)。
dotnet publish CampusBrowser.Server.csproj -c Release -r linux-x64 \
--self-contained true -o /opt/campus-browser-serverAPP 端(无需登录)
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/v1/config?device_id=xxx |
拉当前配置;版本号在 X-Config-Version,签名在 X-Signature |
| POST | /api/v1/devices/register |
设备注册(上报名称、版本、IP) |
| POST | /api/v1/devices/heartbeat |
心跳上报 |
| POST | /api/v1/photo |
照片上报(type=startup 启动拍照 / wrong_pin 输错密码拍照) |
| POST | /api/v1/verify-pin |
PIN 哈希服务端校验(每分钟限 5 次,429) |
| GET | /api/v1/public-key |
获取签名公钥 |
管理端(需 Authorization: Bearer <token>)
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/login / /api/logout |
登录 / 登出 |
| GET/POST | /api/admin/config、/api/admin/config/publish |
查看 / 发布配置 |
| GET/POST | /api/admin/config/versions、/api/admin/config/rollback?version=x |
版本列表 / 回滚 |
| GET | /api/admin/devices |
设备列表(含 IP、在线状态、拍照时间) |
| GET | /api/admin/devices/export.csv |
设备列表 CSV 导出(可选列、可选时间段) |
| GET | /api/admin/photo?deviceId=&file=&type= |
查看设备照片(type=startup/wrong_pin) |
| GET/POST | /api/admin/security |
读取 / 更新安全设置(UA 强制校验开关) |
| GET | /api/admin/public-key |
查看公钥(内置到 APP) |
| 字段 | 说明 |
|---|---|
home_url / fallback_url |
首页 / 备用网址 |
mode |
whitelist 或 blacklist |
rules |
规则数组,支持 *.example.edu.cn、host:8080 端口、https://host/* 路径、精确网址;不区分协议 |
bookmarks |
教师快捷书签 [{title,url}] |
allowed_apps |
可唤醒应用白名单 [{package,label,scheme}] |
hidden_entry_enabled |
是否允许 APP 隐藏入口(关闭后仅服务器可重开) |
block_screenshot |
是否全局禁止截屏/录屏 |
update_interval_seconds |
APP 轮询间隔(30~86400) |
require_startup_photo |
是否要求平板启动时拍前置照片上传(默认 false) |
admin_pin_hash |
平板 6 位管理密码哈希(v0.7.1 起不下发给 APP,仅服务端校验用) |
- 后台登录密码 PBKDF2-SHA256(10 万次迭代 + 随机盐 + 定长比较)
- 登录限频:每 IP 每分钟 5 次(v0.7.1,.NET 8 内置滑动窗口限频器)
- 登录防枚举:用户名不存在与密码错误返回完全一致(v0.7.1)
- 登录令牌 192 位 CSPRNG;6 小时 TTL + 滑动续期,过期自动清理(v0.7.1)
- 全部 SQL 查询参数化,无字符串拼接注入面
- 管理后台所有动态输出经 HTML 转义(v0.4.0 修复存储型 XSS)
- 响应不暴露 Server 头
- 配置 RSA-2048 签名,APP 验签失败拒绝使用;下发前剥离 PIN 哈希并重签(v0.7.1)
- 内网默认 HTTP,建议生产环境通过 HTTPS 反向代理或启用 TLS
GPL-3.0