0

권한있는 사용자가 현재 데이터를 저장하고 전자 메일을 기록하려고 시도하고 있는지 확인하려고합니다. 사용자 전자 메일로 일반 필드 업데이트

나는 타임 스탬프에 대한 업데이트를 수행 내 dbcontext의 기본 설정을 가지고 있지만 난 사용자 정보에 액세스하는 방법을 알아낼 수 없습니다 :이 모든 ASP 코어 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

호는 DbContext' 그것이 IdentityDbContext' '에서 파생 또는 인증 정의 구현하고자'구현 한을'동안 SavaChange' . – 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에 들어있는 개체를 주입. 익명 사용자의 경우 User = null입니다. 모델 자체도 범위가 지정됩니다. 에서 ConnectionInfo 클래스 :

모델에서 이제
public class ConnectionInfo 
{ 
    public string ConnectionString { get; set; } 
    public string User { get; set; } 
} 

다음과 같은 생성자가 :

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