在 ASP.NET Core Web API 中实现审计跟踪

一.介绍

审计跟踪对于跟踪数据变化、维护安全性规至关重要。在本文中,我们将在 ASP.NET Core Web API 中实现审计跟踪。该示例将涵盖从设置项目到执行 CRUD 操作和验证审计日志的所有内容。

二.先决条件

  1. Visual Studio 或 Visual Studio Code
  2. SQL Server(或合适的 SQL 数据库)

三.实现方法

步骤 1.创建一个新项目

打开终端或命令提示符并运行以下命令来创建一个新的 ASP.NET Core Web API 项目:

dotnet new webapi -n AuditTrailExample
cd AuditTrailImplementtionInAspNetCoreWebAPI

步骤 2.安装所需的 NuGet 包

安装 Entity Framework Core 和 SQL Server 必要的包。

dotnet add package Microsoft.EntityFrameworkCore
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools
dotnet add package Microsoft.AspNetCore.Http.Abstractions

步骤 3. 定义数据模型

创建产品和审计日志实体。

3.1.产品实体

创建一个新的文件夹 Models 并添加 Product 类。

namespace AuditTrailImplementtionInAspNetCoreWebAPI.Model
{public class Product{public int Id { get; set; }public string Name { get; set; }public decimal Price { get; set; }public int Stock { get; set; }}}
3.2.审计日志实体

添加 AuditLog 类。

namespace AuditTrailImplementtionInAspNetCoreWebAPI.Model
{public class AuditLog{public int Id { get; set; }public string? UserId { get; set; }public DateTime Timestamp { get; set; }public string? Action { get; set; }public string? TableName { get; set; }public string? RecordId { get; set; }public string? Changes { get; set; }}
}

步骤 4.配置数据库上下文

创建新文件夹Data并添加ApplicationDbContext类:

using AuditTrailImplementtionInAspNetCoreWebAPI.Model;
using Microsoft.EntityFrameworkCore.ChangeTracking;
using Microsoft.EntityFrameworkCore;
using System.Security.Claims;
using System.Collections.Generic;
namespace AuditTrailImplementtionInAspNetCoreWebAPI.Data
{public class ApplicationDbContext : DbContext{private readonly IHttpContextAccessor _httpContextAccessor;public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options, IHttpContextAccessor httpContextAccessor): base(options){_httpContextAccessor = httpContextAccessor;}public DbSet<AuditLog> AuditLogs { get; set; }public DbSet<Product> Products { get; set; }public override int SaveChanges(){var auditEntries = OnBeforeSaveChanges();var result = base.SaveChanges();OnAfterSaveChanges(auditEntries);return result;}private List<AuditEntry> OnBeforeSaveChanges(){ChangeTracker.DetectChanges();var auditEntries = new List<AuditEntry>();var userId = _httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier);foreach (var entry in ChangeTracker.Entries()){if (entry.Entity is AuditLog || entry.State == EntityState.Detached || entry.State == EntityState.Unchanged){continue;}var auditEntry = new AuditEntry(entry){TableName = entry.Entity.GetType().Name,Action = entry.State.ToString(),UserId = "1234"};auditEntries.Add(auditEntry);foreach (var property in entry.Properties){string propertyName = property.Metadata.Name;if (property.IsTemporary){auditEntry.TemporaryProperties.Add(property);continue;}if (entry.State == EntityState.Added){auditEntry.NewValues[propertyName] = property.CurrentValue;}else if (entry.State == EntityState.Deleted){auditEntry.OldValues[propertyName] = property.OriginalValue;}else if (entry.State == EntityState.Modified && property.IsModified){auditEntry.OldValues[propertyName] = property.OriginalValue;auditEntry.NewValues[propertyName] = property.CurrentValue;}}}foreach (var auditEntry in auditEntries.Where(e => !e.HasTemporaryProperties)){AuditLogs.Add(auditEntry.ToAuditLog());}return auditEntries.Where(e => e.HasTemporaryProperties).ToList();}private void OnAfterSaveChanges(List<AuditEntry> auditEntries){if (auditEntries == null || auditEntries.Count == 0){return;}foreach (var auditEntry in auditEntries){foreach (var prop in auditEntry.TemporaryProperties){if (prop.Metadata.IsPrimaryKey()){auditEntry.KeyValues[prop.Metadata.Name] = prop.CurrentValue;}else{auditEntry.NewValues[prop.Metadata.Name] = prop.CurrentValue;}}AuditLogs.Add(auditEntry.ToAuditLog());}SaveChanges();}}
}
4.1.添加连接字符串

在 appsettings.json 中,将连接字符串添加到您的 SQL Server:

{"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"ConnectionStrings": {"DefaultConnection": "Server=SARDAR-MUDASSAR\\SQLEXPRESS2022;database=AuditLog;User ID=sa;Password=Smak$95;Trusted_Connection=True;MultipleActiveResultSets=true;TrustServerCertificate=True"},"AllowedHosts": "*"
}

步骤 5.配置服务和中间件

更新 Program.cs 文件以配置服务和中间件:

using AuditTrailImplementtionInAspNetCoreWebAPI.Data;
using Microsoft.EntityFrameworkCore;
namespace AuditTrailImplementtionInAspNetCoreWebAPI
{public class Program{public static void Main(string[] args){var builder = WebApplication.CreateBuilder(args);// Add services to the container.builder.Services.AddDbContext<ApplicationDbContext>(options =>options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));builder.Services.AddControllers();builder.Services.AddHttpContextAccessor();// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbucklebuilder.Services.AddEndpointsApiExplorer();builder.Services.AddSwaggerGen();var app = builder.Build();// Configure the HTTP request pipeline.if (app.Environment.IsDevelopment()){app.UseSwagger();app.UseSwaggerUI();}app.UseHttpsRedirection();app.UseAuthorization();app.MapControllers();app.Run();}}
}

步骤 6. 创建产品控制器

创建一个 Controllers 文件夹并添加 ProductsController 类。

using AuditTrailImplementtionInAspNetCoreWebAPI.Data;
using AuditTrailImplementtionInAspNetCoreWebAPI.Model;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Threading.Tasks;
namespace AuditTrailImplementtionInAspNetCoreWebAPI.Controllers
{[ApiController][Route("[controller]")]public class ProductsController : ControllerBase{private readonly ApplicationDbContext _context;public ProductsController(ApplicationDbContext context){_context = context;}[HttpGet]public async Task<IActionResult> GetProducts(){var products = await _context.Products.ToListAsync();return Ok(products);}[HttpGet("{id}")]public async Task<IActionResult> GetProduct(int id){var product = await _context.Products.FindAsync(id);if (product == null){return NotFound();}return Ok(product);}[HttpPost]public async Task<IActionResult> CreateProduct([FromBody] Product newProduct){_context.Products.Add(newProduct);await _context.SaveChangesAsync();return CreatedAtAction(nameof(GetProduct), new { id = newProduct.Id }, newProduct);}[HttpPut("{id}")]public async Task<IActionResult> UpdateProduct(int id, [FromBody] Product updatedProduct){var product = await _context.Products.FindAsync(id);if (product == null){return NotFound();}product.Name = updatedProduct.Name;product.Price = updatedProduct.Price;product.Stock = updatedProduct.Stock;await _context.SaveChangesAsync();return NoContent();}[HttpDelete("{id}")]public async Task<IActionResult> DeleteProduct(int id){var product = await _context.Products.FindAsync(id);if (product == null){return NotFound();}_context.Products.Remove(product);await _context.SaveChangesAsync();return NoContent();}}
}

步骤 7. 应用迁移并更新数据库

生成迁移文件并更新数据库。

add migration IMAuditTrail22042024
Update-database

步骤 8. 测试实施

使用 API 执行 CRUD 操作并验证 AuditLogs 表是否填充了适当的条目。

四.CRUD 操作示例

  1. 创建新产品
curl -X POST "https://localhost:5001/products" -H "accept: text/plain" -H "Content-Type: application/json" -d "{ \"name\": \"New Product\", \"price\": 19.99, \"stock\": 100 }"
  1. 更新产品
curl -X PUT "https://localhost:5001/products/1" -H "accept: text/plain" -H "Content-Type: application/json" -d "{ \"name\": \"Updated Product\", \"price\": 29.99, \"stock\": 150 }"
  1. 删除产品
curl -X DELETE "https://localhost:5001/products/1" -H "accept: text/plain"

五.检查审计日志

执行上述操作后,检查数据库中的 AuditLogs 表,确保其中填充了预期的条目。

六.结论

通过遵循此端到端示例,您已成功在 ASP.NET Core Web API 中实现了审计跟踪。此实现有助于跟踪数据的变化,这对于维护安全性、合规性和调试问题至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/47959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习大数据DAY20 Linux环境配置与Linux基本指令

目录 Linux 介绍 Linux 发行版 Linux 和 Windows 比较 Linux 就业方向&#xff1a; 下载 CentOS Linux 目录树 Linux 目录结构 作业 1 常用命令分类 文件目录类 作业 2 vim 编辑文件 作业 3 你问我第 19 天去哪了&#xff1f;第 19 天在汇报第一阶段的知识总结&#xff0c;没什…

QT5:多窗口跳转

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助 目录 前言 一、环境 二、步骤 三、代码实现 四、效果图 前言 学习使用qt5完成多窗口&#xff08;界面&#xff09;跳转&#xff1a;从主界面可分别跳转至界面一和界面二&#xf…

Spring Boot集成SFTP快速入门Demo

1.什么是SFTP&#xff1f; SFTP&#xff08;SSH File Transfer Protocol&#xff0c;也称 Secret File Transfer Protocol&#xff09;&#xff0c;是一种基于SSH&#xff08;安全外壳&#xff09;的安全的文件传输协议。使用SFTP协议可以在文件传输过程中提供一种安全的加密算…

主从复制 哨兵服务 数据类型 持久化

配置主从复制 一主多从结构 配置一主一从结构 修改配置文件 配置salve服务器 配置带验证的主从复制 查看密码&#xff0c;默认redis服务没有密码 192.168.88.61:6379> config get requirepass 设置密码 192.168.88.61:6379> config set requirepass 123456 输入密码…

Spring Boot2(Spring Boot 的Web开发 springMVC 请求处理 参数绑定 常用注解 数据传递)

目录 一、Spring Boot 的Web开发 1. 静态资源映射规则 2. enjoy模板引擎 二、springMVC 1. springMVC-请求处理 测试&#xff1a; 以post方式请求 限制请求携带的参数 GetMapping 查询 PostMapping 新增 DeleteMapping删除 PutMapping 修改 2. springMVC-参…

HarmonyOS鸿蒙- 跳转系统应用能力

一、通过弹窗点击设置跳转系统应用能力 1、 自定义弹窗效果图 2、 自定义弹窗代码 import { common, Want } from kit.AbilityKit; import { BusinessError } from kit.BasicServicesKit;export function alertDialog() {AlertDialog.show({title: ,message: 当前功能依赖定位…

ranger审计日志对接CDH solr

作者&#xff1a;耀灵 一、准备条件 1、已安装完毕ranger-admin 2、已在CDH上部署solr&#xff08;注意在安装solr时更改下solr在zk上的节点信息&#xff09; 二、更改相关配置 1、修改ranger-2.1.0-admin/contrib/solr_for_audit_setup/install.properties SOLR_USERsolr …

音视频环境搭建

整体流程参考&#xff1a; Windows 10开发环境搭建 这里记录一下期间的遇到的问题&#xff1a; 下载的ffmpeg&#xff0c;将ffmpeg的bin目录添加到系统环境变量&#xff0c;然后将SDL的dll动态库拷贝到ffmpeg的bin目录下或将其所在的目录也添加到环境变量&#xff0c;不一定非要…

huawei USG6001v1学习---防火墙相关知识(2)

目录 1.安全策略 2.防火墙的状态检测和会话表技术 3.FTP 4.用户认证 5.认证策略 1.安全策略 传统包过滤技术 --- 其本质就是ACL访问控制列表&#xff0c;根据数据包的特征进行过滤&#xff0c;对比规则&#xff0c; 执行对应的动作&#xff1b; 这里数据包的特征 --- …

题解|2024暑期杭电多校01

【原文链接】 1001.循环位移 字符串 题目大意 给定两个字符串 A , B A,B A,B 。 定义 [ A ] [A] [A] 为字符串 A A A 的循环位移任意次可以得到的所有字符串的集合。 求 B B B 包含 [ A ] [A] [A] 中元素的个数。 解题思路 利用字符串Hash快速匹配。 将 [ A ] [A] …

switch可应用于哪些数据类型说说java中的数组和多维数组

switch可以用于哪些数据类型&#xff1f; switch是一种条件控制语句&#xff0c;根据不同的条件执行不同的代码块。switch使用一个或者多个不同的值来匹配某个表达式的值&#xff0c;并且根据结果来匹配不同的值。switch的语句基本格式 switch&#xff08;expression&#xf…

Web安全:未验证的重定向和转发.

Web安全&#xff1a;未验证的重定向和转发. 未验证的重定向和转发漏洞是一种常见的Web安全漏洞&#xff0c;它允许攻击者将用户重定向到一个恶意的URL&#xff0c;而不是预期的安全URL。这种漏洞通常发生在应用程序处理重定向和转发请求时&#xff0c;未能对目标URL进行适当的…

探索 PDF 转 Markdown 的项目:MinerU 和 pdfParser

pdfParser 项目是在MinerU 项目 的基础上开发的&#xff0c;增加了表格识别功能 MinerU&#xff1a;综合数据提取工具 MinerU 项目 是一款一站式、开源、高质量的数据提取工具&#xff0c;支持 PDF、网页和电子书的提取。其 Magic-PDF 模块可以将 PDF 转换为 Markdown 格式&a…

display: flex 和 justify-content: center 强大居中

你还在为居中而烦恼吗&#xff0c;水平居中多个元素、创建响应式布局、垂直和水平同时居中内容。它&#xff0c;display: flex 和 justify-content: center 都可以完成&#xff01; display: flex&#xff1a;将元素定义为flex容器 justify-content&#xff1a;定义项目在主轴…

el-popover嵌套select弹窗点击实现自定义关闭

需求 el-popover弹窗内嵌套下拉选择框&#xff0c;点击el-popover弹出外部区域需关闭弹窗&#xff0c;点击查询、重置需关闭弹窗&#xff0c; 实现 根据需求要自定义弹窗的关闭和显示&#xff0c;首先想到的是visible属性&#xff0c;在实现过程中经过反复的测验&#xff0…

区块链技术实现数字电网内数据可信共享 |《超话区块链》直播预告

随着全球电力市场朝着构建“SmartGrid”和“IntelliGrid”的目标发展&#xff0c;国内电力公司也提出了构建“数字电网”的愿景。清大科越推出新型电力系统区块链服务平台&#xff0c;通过便捷的建链、上链、用链及治链能力&#xff0c;有效解决数字电网各主体间数据共享的信任…

为什么要从C语言开始编程

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C语言的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;很多小伙伴在入门编程时。都…

docker的学习(一):docker的基本概念和命令

简介 docker的学习&#xff0c;基本概念&#xff0c;以及镜像命令和容器命令的使用 docker docker的基本概念 一次镜像&#xff0c;处处运行。 在部署程序的过程中&#xff0c;往往是很繁琐的&#xff0c;要保证运行的环境&#xff0c;软件的版本&#xff0c;配置文件&…

机器学习中的数据分析

数据分析是一个涉及收集、清洗、转换、建模和解释数据的过程&#xff0c;目的是揭示模式、趋势和结论&#xff0c;以支持决策制定。以下是一个简化版的数据分析教程&#xff0c;分为几个关键步骤&#xff1a; 1. 定义问题 明确你希望通过数据分析解决的问题。这可能涉及到商业…

安装 Maven

安装 Maven 的步骤&#xff1a; 1. 访问 Maven 官方网站: https://maven.apache.org/download.cgi 2. 下载 Maven 的二进制文件 3. 解压下载的文件到希望安装的目录 4. 将 Maven 的 bin 目录添加到您的系统环境变量 PATH 中&#xff08;配置环境变量&#xff09; 这个步骤可…