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

时间:2017-12-26 07:28:35

标签: asp.net entity-framework entity-framework-core identityserver4 asp.net-core-2.0

我想知道授权用户当前正在尝试保存数据并记录他们的电子邮件。

我的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中获取用户电子邮件,以便我可以录制它?

1 个答案:

答案 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;
}