# JWTWebApi **Repository Path**: sky0535/JWTWebApi ## Basic Information - **Project Name**: JWTWebApi - **Description**: 实现简单的JWT身份认证和授权示例 - **Primary Language**: C# - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2025-03-18 - **Last Updated**: 2025-09-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: JWT, WebApi ## README # JWT WebAPI 项目 ## 📋 项目概述 这是一个基于 ASP.NET Core 8.0 的 Web API 项目,演示了如何使用 JWT (JSON Web Token) 进行身份认证和授权。项目包含了完整的登录认证、订单管理功能,并集成了 Serilog 日志记录、Swagger API 文档等功能。 ## ✨ 功能特性 - 🔐 **JWT 身份认证**:完整的 JWT Token 生成、验证和授权机制 - 📊 **订单管理**:受保护的订单查询和管理 API - 📁 **文件上传**:支持图片文件上传功能 - 📝 **日志记录**:集成 Serilog,支持控制台和文件日志输出 - 📖 **API 文档**:集成 Swagger,提供交互式 API 文档 - 🌐 **CORS 支持**:配置跨域资源共享 - 🎨 **前端测试页面**:提供 HTML 测试页面用于 API 调试 ## 🛠️ 技术栈 - **框架**:ASP.NET Core 8.0 - **认证**:JWT Bearer Authentication - **日志**:Serilog - **API 文档**:Swagger/OpenAPI - **序列化**:Newtonsoft.Json - **前端**:HTML + JavaScript + Bootstrap 3.3.7 ## 📦 依赖包 ```xml ``` ## 🚀 快速开始 ### 环境要求 - .NET 8.0 SDK - Visual Studio 2022 或 VS Code ### 运行项目 1. **克隆项目** ```bash git clone cd JWTWebApi ``` 2. **还原依赖** ```bash dotnet restore ``` 3. **运行项目** ```bash dotnet run --project JWTWebApi ``` 4. **访问应用** - API 基础地址:`https://localhost:5001` - Swagger 文档:`https://localhost:5001/swagger` - 测试页面:`https://localhost:5001/JwtTest.html` ## 📚 API 文档 ### 认证接口 #### 获取 JWT Token ```http POST /api/Login/GetJwtToken Content-Type: application/json { "userName": "admin", "password": "123456" } ``` **响应示例:** ```json { "success": true, "message": "获取Token成功", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." } ``` ### 订单接口 #### 获取订单信息 ```http GET /api/Order?id=1 Authorization: Bearer ``` **响应示例:** ```json { "orderId": 1, "customerId": 2, "customerName": "admin", "tokenUserName": "admin", "orderDate": "2024-01-01T10:00:00", "totalAmount": 110.0, "status": "已完成" } ``` #### 上传图片 ```http POST /api/Order/UploadImgage Authorization: Bearer Content-Type: multipart/form-data file: ``` ## 📁 项目结构 ``` JWTWebApi/ ├── Controllers/ # 控制器 │ ├── LoginController.cs # 登录认证控制器 │ └── OrderController.cs # 订单管理控制器 ├── Models/ # 数据模型 │ ├── JwtTokenModel.cs # JWT Token 模型 │ ├── LoginModel.cs # 登录模型 │ ├── OrderData.cs # 订单数据模型 │ └── TokenResult.cs # Token 结果模型 ├── Utils/ # 工具类 │ ├── AppSettings.cs # 配置设置 │ └── JwtHelper.cs # JWT 帮助类 ├── wwwroot/ # 静态文件 │ ├── JwtTest.html # JWT 测试页面 │ ├── ApiTest.html # API 测试页面 │ ├── css/ # 样式文件 │ ├── libs/ # 第三方库 │ └── scripts/ # JavaScript 文件 ├── Uploads/ # 文件上传目录 ├── Program.cs # 程序入口 ├── appsettings.json # 配置文件 └── JWTWebApi.csproj # 项目文件 ``` ## ⚙️ 配置说明 ### JWT 配置 在 `appsettings.json` 中配置 JWT 参数: ```json { "Jwt": { "Issuer": "http://yourdomain.com", "Audience": "web-client", "SecretKey": "secret-key@2025-12345678-abc123456789", "ExpireMinutes": 60 } } ``` ### CORS 配置 ```json { "CorsAccessorSettings": { "AllowCredentials": true, "AllowOrigins": [ "http://localhost:5279", "http://localhost:5500", "http://127.0.0.1:5500" ] } } ``` ### 日志配置 项目使用 Serilog 进行日志记录,支持控制台和文件输出: ```json { "Serilog": { "MinimumLevel": { "Default": "Information", "Override": { "Microsoft": "Warning", "System": "Warning" } }, "WriteTo": [ { "Name": "Console" }, { "Name": "File", "Args": { "path": "Logs/app-.log", "rollingInterval": "Day", "retainedFileCountLimit": 30 } } ] } } ``` ## 🧪 测试 ### 使用 Swagger 测试 1. 启动项目后访问 `https://localhost:5001/swagger` 2. 首先调用 `/api/Login/GetJwtToken` 获取 Token 3. 点击 "Authorize" 按钮,输入 `Bearer ` 4. 测试受保护的 API 接口 ### 使用测试页面 访问 `https://localhost:5001/JwtTest.html` 使用内置的测试页面进行功能测试。 ### 使用 HTTP 文件测试 项目包含 `JWTWebApi.http` 文件,可以在 Visual Studio 或 VS Code 中直接运行 HTTP 请求进行测试。 ## 🔧 开发指南 ### 添加新的 API 接口 1. **创建模型**:在 `Models` 文件夹中添加数据模型 2. **创建控制器**:在 `Controllers` 文件夹中添加新的控制器 3. **添加授权**:使用 `[Authorize]` 特性保护需要认证的接口 4. **添加日志**:注入 `ILogger` 并添加适当的日志记录 ### 自定义 JWT Claims 在 `JwtHelper.cs` 中修改 `IssueJwt` 方法来添加自定义的 Claims: ```csharp var claims = new[] { new Claim(ClaimTypes.Name, tokenModel.UserName), new Claim(ClaimTypes.Role, tokenModel.Role), new Claim("uid", tokenModel.Uid.ToString()), // 添加更多自定义 Claims }; ``` ### 扩展文件上传功能 当前项目支持图片上传,可以在 `OrderController.cs` 的 `UploadImgage` 方法基础上扩展: - 添加文件类型验证 - 实现文件大小限制 - 添加文件存储到云服务的功能 ## 🔒 安全注意事项 1. **生产环境配置**: - 更改默认的 JWT SecretKey - 启用 HTTPS - 配置适当的 CORS 策略 - 使用环境变量存储敏感配置 2. **Token 安全**: - 设置合理的过期时间(建议不超过24小时) - 考虑实现 Refresh Token 机制 - 避免在客户端长期存储敏感信息 - 实现 Token 黑名单机制 3. **日志安全**: - 避免记录敏感信息(如密码、完整 Token) - 定期清理日志文件 - 在生产环境中调整日志级别 4. **输入验证**: - 对所有用户输入进行验证 - 使用数据注解进行模型验证 - 防止 SQL 注入和 XSS 攻击 ## 🚀 部署指南 ### 本地部署 ```bash # 发布项目 dotnet publish -c Release -o ./publish # 运行发布版本 cd publish dotnet JWTWebApi.dll ``` ### Docker 部署 创建 `Dockerfile`: ```dockerfile FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base WORKDIR /app EXPOSE 80 EXPOSE 443 FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /src COPY ["JWTWebApi/JWTWebApi.csproj", "JWTWebApi/"] RUN dotnet restore "JWTWebApi/JWTWebApi.csproj" COPY . . WORKDIR "/src/JWTWebApi" RUN dotnet build "JWTWebApi.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "JWTWebApi.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "JWTWebApi.dll"] ``` 构建和运行 Docker 容器: ```bash # 构建镜像 docker build -t jwtwebapi . # 运行容器 docker run -d -p 8080:80 --name jwtwebapi-container jwtwebapi ``` ## 🔄 版本更新 ### v1.0.0 (当前版本) - 基础 JWT 认证功能 - 订单管理 API - 文件上传功能 - Serilog 日志集成 - Swagger API 文档 ## 📚 相关文档 - [Document.md](Document.md) - JWT 技术详细教程 - [ASP.NET Core 官方文档](https://docs.microsoft.com/aspnet/core/) - [JWT 官方网站](https://jwt.io/) - [Serilog 文档](https://serilog.net/) ## 🤝 贡献 欢迎提交 Issue 和 Pull Request 来改进这个项目。 ### 贡献指南 1. Fork 项目 2. 创建功能分支 (`git checkout -b feature/AmazingFeature`) 3. 提交更改 (`git commit -m 'Add some AmazingFeature'`) 4. 推送到分支 (`git push origin feature/AmazingFeature`) 5. 打开 Pull Request ## 📄 许可证 本项目采用 MIT 许可证,详见 [LICENSE](LICENSE) 文件。 --- **注意**:这是一个学习和演示项目,在生产环境中使用前请确保进行适当的安全配置和测试。 ## 🙏 致谢 感谢以下开源项目和社区的支持: - ASP.NET Core 团队 - Serilog 社区 - JWT.io - Bootstrap 团队 --- *最后更新:2024年12月*