Downscope Azure SQL Разрешения сервера - PullRequest
0 голосов
/ 05 августа 2020

При работе в службе приложения в Azure я хотел бы использовать идентификатор управляемой службы для аутентификации на Azure SQL сервере с двумя наборами разрешений. В моем сервисе я хотел бы иметь DBContext для чтения / записи и DBContext только для чтения. Есть ли способ понизить уровень доступа после аутентификации?

У меня не обязательно есть доступ к AG с репликой только для чтения, поэтому я не думаю, что могу использовать applicationintent=readonly и EXECUTE AS только кажется применимым в хранимой процедуре или функции.

Есть другие предложения?

1 Ответ

0 голосов
/ 05 августа 2020

Я ошибался, говоря, что EXECUTE AS не работает вне хранимой процедуры / функции (я обнаружил, что эта документация вводит в заблуждение, а позже обнаружил это .

Таким образом, я пришел к следующему решению:

  1. Создать пользователя только для чтения без входа в систему

    CREATE USER [readonly_user] WITHOUT LOGIN
    ALTER ROLE [db_datareader] ADD MEMBER [readonly_user]
    
  2. Я создаю перехватчик, который ищет флаг applicationintent=readonly для установки в строке подключения

    public class SessionContextDbConnectionInterceptor: DbCommandInterceptor {
      /// <inheritdoc />
      public override Task<InterceptionResult<DbDataReader>> ReaderExecutingAsync(
        DbCommand command,
        CommandEventData eventData,
        InterceptionResult<DbDataReader> result,
        CancellationToken cancellationToken = new CancellationToken()) {
        if (eventData.Connection.ConnectionString.Contains("applicationintent=readonly",
                                                           StringComparison.InvariantCultureIgnoreCase)) {
          command.CommandText = $"EXECUTE AS USER = 'readonly_user';\n{command.CommandText};\nREVERT;";
        }
        return base.ReaderExecutingAsync(command, eventData, result, cancellationToken);
      }
    }
    
  3. Затем зарегистрируйте перехватчик в контексте БД

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(configuration.GetConnectionString("DefaultConnection"))
        .AddInterceptors(new SessionContextDbConnectionInterceptor()));
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...