使用用户电子邮件更新公共字段

问题描述 投票:0回答:1

我试图找出授权用户当前正在尝试保存数据并记录他们的电子邮件的内容。

我在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 = "[email protected]" // 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中获取用户电子邮件,以便我可以录制它?

asp.net entity-framework entity-framework-core identityserver4 asp.net-core-2.0
1个回答
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;
}
© www.soinside.com 2019 - 2024. All rights reserved.