0

権限のあるユーザーが現在データを保存して電子メールを記録しようとしているかどうかを調べようとしています。ユーザーのメールで一般的なフィールドを更新する

私は、タイムスタンプのアップデートを行いますが、私は、ユーザー情報にアクセスする方法を見つけ出すことはできません私のdbcontextにおける基本的なセットアップがあります。これは、すべてのASPのCore 2上に構築されている背景の

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

もう少しおよびEFコア。 DBContextは、ASP Core 2とIdentity Server4上に構築されたIDPContosoというカスタムIDプロバイダを使用する私のAPIContosoプロジェクトにあります。

私はそれを記録できるようにDBContext内のユーザーの電子メールを取得する方法はありますか?

+0

実現しませんでした。 – Aria

+0

ChangeTracker.Entries を使用すると、特定のタイプのすべての添付されたエントリをキャストするのではなく、null参照として実行できるようになります。 – DevilSuichiro

答えて

1

アイデンティティから電子メールを受け取ることをお勧めします。この方法では、データベースへの追加呼び出しは必要ありません。電子メールを使用してログインしている場合、User.Identity.Nameには電子メールが含まれています(正しくマップされている場合)。それ以外の場合は、電子メールを含むクレームを追加します。

これでモデルにメールを注入する必要があります。私はモデルのための別々のプロジェクトを想定しています。その場合は、IHttpContextAccessorだけを注入することはできません。それ以外の場合は、モデルの構築時にIHttpContextAccessorを挿入してユーザー情報を読み取るだけで済みます。

次のコードは、デモンストレーション用です。これは、スコープされているので、ユーザが接続するたびに、ユーザ情報が設定されている

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>(); 
} 

:Startup.csにconnectionInfoを含むオブジェクトを注入します。匿名ユーザーの場合、ユーザー= null。モデル自体もスコープされていることに注意してください。 connectionInfoクラス:

public class ConnectionInfo 
{ 
    public string ConnectionString { get; set; } 
    public string User { get; set; } 
} 

今モデルでは、あなたが次のコンストラクタいる:ホーあなたはDbContext`はそれがIdentityDbContext` `由来する、またはあなたが` SavaChange`ながら、カスタム認証を実装したいです `

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; 
} 
関連する問題