簡體   English   中英

ASP.NET Core 2.2在DbContext中獲取userId

[英]ASP.NET Core 2.2 get userId in DbContext

我是ASP.NET Core的新手。 我想使用實體框架核心和ASP.NET身份創建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; } } }}} 

這是我如何在.net core 2.2中獲取用戶ID

首先,您需要在Startup.cs中注冊

services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();

然后為您服務

private readonly IHttpContextAccessor _httpContextAccessor;

public UserService(
    IHttpContextAccessor httpContextAccessor)
{

}

var currentUserGuid = _httpContextAccessor?.HttpContext?.User?.FindFirst(UserClaimsKey.Sub)?.Value;

嘗試直接將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);
     //...
   }
}
private async Task<ApplicationUser> GetUserDetailsAnsyc()
{
  return await userManager.GetUserAnsync(HttpContext.User);
}

var user = await GetUserDetailsAnsyc();
Console.WriteLine(user.Id.ToString());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM