编辑 | blame | 历史 | 原始文档

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 下:

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
  1. 把发布产物(dotnet publish 输出)放到站点物理路径。
  2. 确保应用使用 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(任意命中即通过)

示例:

{
  "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