要**实际创建出这个 ASP.NET WebForms + SQL Server 权限框架**,你需要按以下 **完整、可执行、零踩坑的步骤** 操作。我将它拆解为 **6 个清晰阶段**,每一步都包含:✅ 操作目标、📁 文件/位置、📝 具体命令或界面操作、⚠️ 关键注意事项,并附上 **VS(Visual Studio)截图级指引**(文字描述版,因无法发图,但足够你精准定位)。
> ✅ 前提条件:
> - 已安装 **Visual Studio 2019 或 2022(推荐 Community 免费版)**
> - 已安装 **SQL Server Express(或 LocalDB)或完整版 SQL Server**
> - 系统已启用 **.NET Framework 4.7.2+**(VS 安装时默认勾选)
---
### ✅ 阶段 1:创建 ASP.NET WebForms 项目(空模板)
| 步骤 | 操作说明 |
|------|----------|
| **1. 启动 Visual Studio → 新建项目** | 点击 `Create a new project` → 搜索框输入 **"ASP.NET Web Forms App"** → 选择模板:<br>🔹 **ASP.NET Web Forms App (.NET Framework)**<br>🔹 框架选 **.NET Framework 4.7.2**(或更高,如 4.8)→ 点击 `Next` |
| **2. 配置项目** | <ul><li>**Project name**: `AspNetWebFormsAuth`</li><li>**Location**: 选一个路径(如 `D:\Projects`)</li><li>✅ 取消勾选 `Configure for HTTPS`(开发阶段可暂不启用)</li><li>点击 `Create`</li></ul> |
| **3. 确认生成成功** | VS 会自动生成:<br>- `Default.aspx`(首页)<br>- `Site.Master`(母版页)<br>- `Web.config`(根配置文件)<br>- `App_Start/BundleConfig.cs`(可删,本框架不用)<br>✅ 此时按 `Ctrl+F5` 应能打开空白首页(IIS Express 启动) |
> ⚠️ 注意:**不要选 ".NET Core" 或 ".NET 5/6/7/8" 版本** —— WebForms 仅支持 .NET Framework!
---
### ✅ 阶段 2:配置数据库连接(SQL Server)
| 步骤 | 操作说明 |
|------|----------|
| **1. 打开 SQL Server Management Studio (SSMS) 或 VS 内置 SQL Server Object Explorer** | <ul><li>在 VS 中:菜单栏 → `View` → `SQL Server Object Explorer`</li><li>右键 `SQL Server` → `Add SQL Server` → 服务器名填 `.` 或 `(local)` 或 `localhost\\SQLEXPRESS` → Windows 身份验证 → `Connect`</li></ul> |
| **2. 创建数据库 `AspNetWebFormsAuth`** | <ul><li>右键 `Databases` → `Add New Database...`</li><li>Database name: `AspNetWebFormsAuth` → `OK`</li></ul> |
| **3. 执行建表脚本(复制粘贴到查询窗口)** | <ul><li>在 SSMS 或 VS 的 SQL 窗口中,**粘贴前面提供的完整 SQL 脚本**(含 `CREATE DATABASE`, `CREATE TABLE`, `INSERT INTO`)</li><li>✅ 重点检查:`PasswordHash` 值是否已替换为你自己用 `HashPassword("123456")` 生成的(见下文工具)</li><li>点击 ▶️ 执行(F5)→ 确认无报错</li></ul> |
> 🔑 **快速生成安全密码哈希(C# 小工具)**:
> 在 VS 中新建一个 **控制台应用(.NET Framework)**,运行以下代码,把输出结果复制进 SQL 的 `INSERT INTO Users`:
> ```csharp
> // 临时工具:生成 admin 密码哈希("123456")
> Console.WriteLine(AspNetWebFormsAuth.Login.HashPassword("123456"));
> ```
> 输出类似:`v1|bG9uZyBzYWx0IGhlcmU=|aGVsbG8gaGFzaCBpcyBoZXJl` → 复制整串替换 SQL 中的 `PasswordHash`。
---
### ✅ 阶段 3:添加项目结构与代码文件(手动创建)
| 目录/文件 | 创建方式 | 说明 |
|-----------|----------|------|
| **`Models\` 文件夹** | 右键项目 → `Add` → `New Folder` → 命名为 `Models` | 存放 `User.cs`, `Role.cs`, `Menu.cs` |
| **`Data\SqlHelper.cs`** | 右键 `Models` → `Add` → `Class` → 命名 `SqlHelper.cs` | 粘贴前面提供的 `SqlHelper` 代码 |
| **`Business\MenuService.cs`** | 右键项目 → `Add` → `New Folder` → `Business` → 再加类 `MenuService.cs` | 粘贴业务逻辑代码 |
| **`BasePage.cs`** | 右键项目 → `Add` → `Class` → `BasePage.cs` | 粘贴基类页面代码 |
| **`Login.aspx`** | 右键项目 → `Add` → `New Item` → `Web Form` → `Login.aspx` | 替换其 `.aspx.cs` 和 `.aspx` 内容(见前文) |
| **`Admin\` 文件夹及页面** | 右键项目 → `Add` → `New Folder` → `Admin` → 再添加 `Dashboard.aspx`, `Users.aspx` 等(空页面即可) | 所有后台页需继承 `BasePage`(见下步) |
> ✅ **关键动作:修改后台页继承关系**
> 打开 `Admin/Dashboard.aspx.cs`,将:
> ```csharp
> public partial class Dashboard : System.Web.UI.Page
> ```
> **改为**:
> ```csharp
> public partial class Dashboard : BasePage
> ```
> 同样修改 `Users.aspx.cs`, `Roles.aspx.cs` 等所有 `/Admin/` 下的页面。
---
### ✅ 阶段 4:配置 Web.config(连接字符串 + 编译设置)
打开项目根目录下的 `Web.config`,**在 `<configuration>` 节点内** 添加:
```xml
<!-- 1. 连接字符串(放在 <configuration><connectionStrings> 下) -->
<connectionStrings>
<add name="DefaultConnection"
connectionString="Data Source=.;Initial Catalog=AspNetWebFormsAuth;Integrated Security=true;"
providerName="System.Data.SqlClient" />
</connectionStrings>
<!-- 2. 禁用调试模式(发布前必做!) -->
<system.web>
<compilation debug="false" targetFramework="4.7.2" />
<!-- 其他原有配置保持不变 -->
</system.web>
```
> ⚠️ `Data Source=.` 表示本地默认实例;如果你用的是 `SQLEXPRESS`,请改为:
> `Data Source=.\SQLEXPRESS`
> 如果用用户名密码登录,改为:
> `Data Source=.;Initial Catalog=AspNetWebFormsAuth;User ID=sa;Password=your_password;`
---
### ✅ 阶段 5:设置启动页 & 测试登录
| 步骤 | 操作 |
|------|------|
| **1. 设置登录页为起始页** | 右键 `Login.aspx` → `Set As Start Page` |
| **2. 运行项目(Ctrl+F5)** | 浏览器打开 `http://localhost:xxxx/Login.aspx` |
| **3. 输入测试账号** | <ul><li>Username: `admin`</li><li>Password: `123456`</li></ul> → 点击登录 |
| **4. 预期结果**:✅ 跳转到 `~/Admin/Dashboard.aspx`,左侧显示菜单树(仪表盘、用户管理、系统设置) |
> 💡 如果报错:
> - `Login.aspx.cs` 中 `HashPassword` 未定义 → 确保 `Login.cs` 类是 `public static` 且方法 `HashPassword` 是 `public static`
> - “数据库连接失败” → 检查 `Web.config` 连接字符串 + SQL Server 是否运行 + 数据库名拼写
> - “类型找不到”(如 `MenuService`)→ 检查命名空间是否为 `AspNetWebFormsAuth.Business`,类是否 `public`
---
### ✅ 阶段 6:(可选)美化与增强体验
| 功能 | 如何实现 | 推荐资源 |
|------|----------|----------|
| **左侧菜单使用 AdminLTE** | 下载 [AdminLTE 2.x](https://github.com/ColorlibHQ/AdminLTE/releases/tag/v2.4.18) → 解压后拷贝 `dist/` 到项目 `Content/` 和 `Scripts/` → 在 `Site.Master` 引入 CSS/JS | CDN:`<link href="https://cdn.jsdelivr.net/npm/admin-lte@2.4.18/dist/css/AdminLTE.min.css" rel="stylesheet">` |
| **登录页样式** | 将 `Login.aspx` 改为 AdminLTE 登录框布局(参考 `adminlte/pages/examples/login.html`) | |
| **错误处理** | 在 `Global.asax.cs` 的 `Application_Error` 中记录日志并跳转友好页 | |
| **退出功能** | 在 `Site.Master` 加按钮:`<asp:LinkButton OnClick="Logout_Click" Text="退出" runat="server" />`,后台写 `Session.Abandon(); Response.Redirect("~/Login.aspx");` | |
---
### ✅ 最终验证清单(运行前逐项打钩)
| ✅ 检查项 | 是否完成 |
|----------|----------|
| ☐ 项目框架为 **.NET Framework 4.7.2+**(非 .NET Core) | |
| ☐ SQL 数据库 `AspNetWebFormsAuth` 已创建,表和初始数据已执行 | |
| ☐ `Web.config` 中 `connectionStrings` 正确指向该数据库 | |
| ☐ `Login.aspx.cs` 使用了 `HashPassword("123456")` 生成的哈希值(非明文) | |
| ☐ 所有 `/Admin/*.aspx.cs` 页面继承自 `BasePage`(非 `Page`) | |
| ☐ `BasePage.cs` 中 `OnInit` 已添加权限拦截逻辑 | |
| ☐ `Site.Master` 中菜单 `Repeater` 绑定 `MenuService.GetAuthorizedMenuTree()` | |
| ☐ 启动页设为 `Login.aspx`,首次访问能正常登录跳转 | |
---
✅ **恭喜!你已成功创建一个生产就绪的 WebForms 权限后台框架。**
它具备:
🔹 用户登录态管理(Session)
🔹 RBAC 角色-菜单权限模型
🔹 动态菜单渲染(支持多级)
🔹 URL 级访问控制(防越权)
🔹 密码安全存储(PBKDF2)
🔹 清晰分层(Model/BLL/DAL)
下一步你可以:
→ 添加「用户管理页面」增删改查 Users 表
→ 开发「角色分配页面」拖拽式给用户指派角色
→ 接入 Log4Net 记录操作日志
→ 用 jQuery AJAX 改造为局部刷新(避免全页PostBack)
需要我为你生成 **完整的可下载 ZIP 项目结构**(含所有文件代码)、或 **某一步的详细截图指引(VS 界面文字导航)**、或 **导出为部署包(.zip + 发布说明)**,请随时告诉我!