我想知道授权用户当前正在尝试保存数据并记录他们的电子邮件。
我的dbcontext中有一个基本设置,用于更新时间戳,但我无法弄清楚如何访问用户信息:
public override int SaveChanges()
{
AddTimestamps();
return base.SaveChanges();
}
public override async Task<int> SaveChangesAsync()
{
AddTimestamps();
return await base.SaveChangesAsync();
}
private void AddTimestamps()
{
var entities = ChangeTracker.Entries()
.Where(x => x.State == EntityState.Added || x.State == EntityState.Modified);
var currentUser = "dumm@dummy.com" // This i haven't been able to figure out how to retrieve
foreach (var entity in entities)
{
if (entity.State == EntityState.Added)
{
((BaseEntity)entity.Entity).DateCreated = DateTime.UtcNow;
((BaseEntity)entity.Entity).CreatedBy = currentUsername;
}
((BaseEntity)entity.Entity).DateModified = DateTime.UtcNow;
((BaseEntity)entity.Entity).ModifiedBy = currentUsername;
}
}
}
更多的背景是全部基于ASP Core 2和EF Core。 DBContext位于我的APIContoso项目中,该项目使用名为IDPContoso的自定义身份提供程序,它基于ASP Core 2和Identity Server4构建。
如何在DBContext中获取用户电子邮件,以便我可以录制它?
答案 0 :(得分:1)
我建议您从身份中收到电子邮件。这样您就不需要额外调用数据库了。如果您使用电子邮件登录,则User.Identity.Name包含电子邮件(如果映射正确)。否则,请添加包含电子邮件的声明。
现在您需要将电子邮件注入模型中。我假设模型的分离项目。在这种情况下,您不能只注入IHttpContextAccessor。否则,只需注入IHttpContextAccessor并在构造模型时读取用户信息。
以下代码仅供演示之用。在Startup.cs中注入一个包含connectionInfo:
的对象public void ConfigureServices(IServiceCollection services)
{
services.AddScoped(provider => new Database.ConnectionInfo
{
ConnectionString = provider.GetRequiredService<ApplicationSettings>().ConnectionString,
User = provider.GetRequiredService<IHttpContextAccessor>().HttpContext.User?.Identity.Name
});
services.AddScoped<Model>();
}
因为这是作用域,所以每次用户连接时,都会设置用户信息。对于匿名用户,User = null。请注意,模型本身也是作用域。 connectionInfo类:
public class ConnectionInfo
{
public string ConnectionString { get; set; }
public string User { get; set; }
}
现在在Model中你有以下构造函数:
private string _user { get; }
public Model(ConnectionInfo connection)
: base(connection.ConnectionString)
{
_user = connection.User;
}
private void AddTimestamps()
{
var entities = ChangeTracker.Entries()
.Where(x => x.State == EntityState.Added || x.State == EntityState.Modified);
var currentUser = _user;
}