Заявления о безопасности в DBCommandInterceptor - PullRequest
0 голосов
/ 19 февраля 2020

В настоящее время я использую EF и. NET Core 3 - Радзен для создания приложения. Это работает нормально, но я хочу добавить дополнительные записи в базу данных. Чтобы сделать это, я хотел бы использовать DBCommandInterceptor, как показано здесь , для выполнения некоторых команд после запроса.

Можно ли в этом получить утверждения авторизации Microsoft Класс перехватчика? В моем обычном классе контроллеров я могу просто позвонить

var userId = User.FindFirst(ClaimTypes.Name).Value;

Это не работает в Interceptor и, честно говоря, мои знания об этой среде очень скудны. Я даже не могу сказать вам, почему я могу получить доступ к пользовательской ссылке в моем ObjectController против DBCommandInterceptor

1 Ответ

0 голосов
/ 20 февраля 2020

Если вы добавите Interceptor в DbContext.OnConfiguring, вы можете передать ему любое состояние, которое захотите.

Так что вам нужно, чтобы ваш DbContext принимал Identity, или с зависимостью службы, которую он может использовать для доступа к пользователю , что-то вроде:

public class Db : DbContext
{
    ClaimsIdentity user;
    public Db(ClaimsIdentity user)
    {
        this.user = user;
    }

Затем настройте Перехватчик на прием пользователя или экземпляра DbContext. например,

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseSqlServer("Server=localhost;Database=EFCore3Test;Integrated Security = true", a => a.UseRelationalNulls(true))
                  .ConfigureWarnings(c => c.Log((RelationalEventId.CommandExecuting, LogLevel.Information)))
                  .UseLoggerFactory(MyLoggerFactory)
                  .AddInterceptors(new MyCommandInterceptor(this));

    base.OnConfiguring(optionsBuilder);
}

И пусть перехватчик использует аргумент конструктора:

public class MyCommandInterceptor : DbCommandInterceptor
{
    private Db db;
    public MyCommandInterceptor(Db db)
    {
        this.db = db;
    }

    public override InterceptionResult<DbDataReader> ReaderExecuting(DbCommand command, CommandEventData eventData, InterceptionResult<DbDataReader> result)
    {
        var userId = db.user.FindFirst(ClaimTypes.Name).Value;
        //. . .
        return base.ReaderExecuting(command, eventData, result);
    }

}
...