为了账号安全,请及时绑定邮箱和手机立即绑定

ASP.NET Core 2.2在DbContext中获取userId

ASP.NET Core 2.2在DbContext中获取userId

C#
开满天机 2023-09-16 17:11:35
我对 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;            }        }    }}}
查看完整描述

3 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

尝试直接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);

     //...

   }

}


查看完整回答
反对 回复 2023-09-16
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

这是我在 .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;



查看完整回答
反对 回复 2023-09-16
?
白板的微信

TA贡献1883条经验 获得超3个赞

private async Task<ApplicationUser> GetUserDetailsAnsyc()

{

  return await userManager.GetUserAnsync(HttpContext.User);

}


var user = await GetUserDetailsAnsyc();

Console.WriteLine(user.Id.ToString());


查看完整回答
反对 回复 2023-09-16
  • 3 回答
  • 0 关注
  • 105 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信