# ASP.NET 版本 Board App(IIS 部署用) 本目录是把当前 `board_app_new` 的 Node/Express 实现 **等价迁移** 到 ASP.NET Core 的版本,便于你后续直接把 `aspnet/` 整目录拷贝到新的 IIS 服务器部署。 ## 目录结构 - `BoardApp/`:ASP.NET Core MVC 应用 - `Views/Board/*.cshtml`:页面模板(对应原 `views/*.ejs`) - `wwwroot/static/*`:静态资源(对应原 `public/board/*`,在站点下以 `/board/static/` 访问) - `Config/`:配置读取与类型 - `Services/`:LDAP、SQL Server、场景与日历逻辑 ## 配置文件(与 Node 版一致) 默认从下列目录读取配置(优先级从高到低): - 环境变量 `BOARD_CONFIG_DIR` 指向的目录 - 应用目录下的 `config/` 需存在的 JSON(与 Node 版同名): - `app.config.json` - `ldap.config.json` - `pages.config.json` - `scenarios.system.json` - `scenarios.users.json` - `sqlserver.config.json` - `datasrc.json` ## 本地运行(需要 .NET 8 SDK) 在 `aspnet/BoardApp` 下: ```bash dotnet restore dotnet run ``` 默认监听端口来自 `config/app.config.json` 的 `port`(例如 3000),外部访问地址为: - `http://127.0.0.1:3000/board/` ## 与现有 nginx(`nginx/board.conf`)兼容 同一套 nginx 配置里 **`upstream board_app` → `127.0.0.1:3000`** 时,后端可二选一,**无需改 nginx**: | 契约项 | Node | ASP.NET | |--------|------|---------| | 对外路径前缀 | `/board` | `/board`(`UsePathBase`) | | `auth_request` 子请求 | `GET /board/check/` → 200 / 401 | 同左 | | Session Cookie | `board.sid`,`Path=/` | 同左 | | 登录与静态资源 | `/board/login`、`/board/static/…` | 同左 | 注意:两套程序应使用 **同一套 `config/*.json`**(或相同的 `BOARD_CONFIG_DIR`),否则切换后端时会话与场景数据不一致。`app.config.json` 里 **`trustProxy: true`**(Node)与 ASP.NET 里 **`TrustProxy` + ForwardedHeaders** 便于在 nginx 后正确识别 HTTPS/客户端 IP。 **Windows 集成(Negotiate)一键登录**(`[Authorize]` + `AdLoginAsync`)及 **IIS / nginx 对照** 见:`aspnet/NEGOTIATE-IIS-NGINX.md`;nginx 示例(不覆盖原 `board.conf`):`nginx/board-aspnet-negotiate.sample.conf`。 ## IIS 部署:通过 `:3000/board/` 访问(指导) ### 方案 A(推荐):IIS 站点绑定 3000 + 应用设置 PathBase=/board 1. 在 IIS 新建站点(或现有站点新增绑定): - 绑定端口:`3000` 2. 把发布产物(`dotnet publish` 输出)放到站点物理路径。 3. 确保应用使用 PathBase:`/board`(本项目默认启用;也可用环境变量 `BOARD_PATH_BASE=/board` 显式设置)。 访问:`http://<服务器IP或域名>:3000/board/` ## Windows 集成登录(一键登录) ASP.NET 版新增了 `/board/api/winauth/login`,用于 **Windows Authentication** 集成登录: - 登录页点击“一键登录(Windows 集成)” - 后端从 `HttpContext.User.Identity.Name` 读取域账号(通常是 `DOMAIN\\username`) - 然后(可选)用 LDAP 校验该用户是否属于允许访问的 AD 组 - 通过后把该用户名写入 session,用于读取 `scenarios.users.json` 中该用户自建场景 ### IIS 侧需要的配置 - **启用**:Windows Authentication - **禁用**:Anonymous Authentication(至少对 `/board/api/winauth/login` 生效;最简单是整个站点禁用匿名) -(如果你还要保留“手动输入用户名密码”的表单登录)可以保持匿名开启,但要确保 Windows Auth 仍启用;这种混合模式下浏览器可能不会自动弹出集成认证,需要按浏览器/内网策略调整。 ### LDAP 侧组校验(可选) 为了兼容你现在的 `ldap.config.json`,组校验是可选的:不填就不校验。 在 `ldap.config.json` 增加其中一个字段即可: - `allowedGroupDN`:单个组 DN - `allowedGroupDNs`:多个组 DN(任意命中即通过) 示例: ```json { "url": "ldap://192.168.0.85:389", "bindDN": "cn=ldap_proxy,ou=Service_Accounts,DC=testboard,DC=shsening,DC=com", "bindPassword": "******", "searchBase": "DC=testboard,DC=shsening,DC=com", "searchFilter": "(sAMAccountName={{username}})", "tlsOptions": null, "allowedGroupDN": "CN=BoardUsers,OU=Groups,DC=testboard,DC=shsening,DC=com" } ``` ### 方案 B:IIS 站点根就是 /,但通过 URL Rewrite 统一加前缀 如果你不能/不想让应用感知 `/board`,可以在 IIS 用 URL Rewrite 把 `/board/(.*)` 重写到 `/(.*)`,同时把应用当作站点根运行。 本项目默认使用方案 A;若你要用方案 B,需要调整 `Program.cs` 中的 PathBase 逻辑。 最终publish: dotnet publish -c Debug -r win-x64 --self-contained false -o ./dist