c# - ASP.NET Core 2.2 在 DbContext 中获取 userId
问题描述
我对 ASP.NET Core 很陌生。我想使用 Entity Framework Core 和 ASP.NET Identity 创建 ASP.NET Core 2.2 WebAPI。另外,我想使用 JWT 来保护对带有令牌的 WebAPI 的访问。
我已经成功地将用户插入数据库并从我的 API 中取回令牌,并且令牌身份验证正在工作。
但是,我还想软删除数据库记录并跟踪谁删除/更新/添加了记录。测试表是国家,其中字段只有Title
和Description
。
到目前为止,我已经把互联网颠倒了,但没有帮助:(
我尝试过的最后一件事是(userId 是null
):
在startup.cs中:
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
在我的 AppDbContext.cs
public class AppDbContext : IdentityDbContext<AppUser>{ public AppDbContext(DbContextOptions options) : base(options) { } public DbSet<AppUser> AppUsers { get; set; } public DbSet<Country> Countries { get; set; } // just for testing protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); // TODO - IGNORE THIS //builder.Entity<AppUser>().Property<bool>("IsDeleted"); //builder.Entity<AppUser>().HasQueryFilter(m => EF.Property<bool>(m, "IsDeleted") == false); } public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken)) { CheckBeforeSaving(); return (await base.SaveChangesAsync(true, cancellationToken).ConfigureAwait(false)); } private void CheckBeforeSaving() { var httpContextAccessor = this.GetService<IHttpContextAccessor>(); var userId = httpContextAccessor?.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier); foreach (var entry in ChangeTracker.Entries()) { switch (entry.State) { case EntityState.Detached: break; case EntityState.Unchanged: break; case EntityState.Deleted: entry.State = EntityState.Modified; entry.CurrentValues["IsDeleted"] = true; entry.CurrentValues["DeletedBy"] = userId; entry.CurrentValues["Deleted"] = DateTime.Now; break; case EntityState.Modified: entry.CurrentValues["UpdatedBy"] = userId; entry.CurrentValues["Updated"] = DateTime.Now; break; case EntityState.Added: entry.CurrentValues["IsDeleted"] = false; entry.CurrentValues["CreatedBy"] = userId; entry.CurrentValues["Created"] = DateTime.Now; entry.CurrentValues["Description"] = userId; break; default: break; } } }}}
解决方案
尝试直接IHttpContextAccessor
注入ApplicationDbContext
:
public class ApplicationDbContext : IdentityDbContext<AppUser>
{
private readonly IHttpContextAccessor _httpContextAccessor;
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options, IHttpContextAccessor httpContextAccessor)
: base(options)
{
_httpContextAccessor= httpContextAccessor;
}
//other methods
private void CheckBeforeSaving()
{
var userId = _httpContextAccessor?.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
//...
}
}
推荐阅读
- javascript - 如何编辑json中的值?
- winston - 从 winston 容器中删除所有记录器
- powershell - 没有截断的 PowerShell 脚本输出
- javascript - 动态变量而不是静态导致 JS 变慢?
- node.js - MongoDB数据库连接错误 - Docker Compose
- javascript - 在脚本之外编写 html 内容
- artificial-intelligence - 是否可以对两个以上玩家的非零和游戏使用 alpha-beta 修剪?
- html - 在tippy.js div中添加表单(在cytoscape.js的节点中),但文本输入和按钮不活动
- c# - App.config 与 Mac 上的 C# 中的控制台应用程序
- asp.net-mvc - 单独的 API 项目是否需要 MVC ViewModels 的副本进行映射?