Sql-аутентификация с управляемой идентификацией с EF Core - ошибка входа для пользователя «<участник с указанием токена>»

У меня есть приложение-функция Azure dotnet 5 (изолированное), которому требуется доступ к базе данных Azure Sql Server через EF Core 5.

Если я буду следовать приведенным здесь инструкциям, то в приложении-функции я получу следующую ошибку:

Не удалось войти в систему для пользователя "<участник с указанием токена>"

Однако, если я продвигаю идентификатор объекта управляемого удостоверения для приложения-функции как Sql Admin, используя следующую команду:

      az sql server ad-admin create --resource-group rg-smsrouter-msdn --server-name sql-smsrouter-msdn --display-name MSIAzureAdmin --object-id "id of managed identity here"

Строки написаны правильно. Меня беспокоит то, что управляемое удостоверение не должно быть администратором sql.

Единственный код в моем контексте БД:

          protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            SqlConnection connection = new SqlConnection();
            string? envConString = Environment.GetEnvironmentVariable(ConfigConstants.SqlSvrConnString);
            connection.ConnectionString = envConString ?? "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=SmsRouter";
            optionsBuilder.UseSqlServer(connection);
        }

Я также использую поставщика аутентификации из сообщения в блоге:

          public class SqlAppAuthenticationProvider : SqlAuthenticationProvider
    {
        private static readonly AzureServiceTokenProvider _tokenProvider = new AzureServiceTokenProvider();

        /// <summary>
        /// Acquires an access token for SQL using AzureServiceTokenProvider with the given SQL authentication parameters.
        /// </summary>
        /// <param name="parameters">The parameters needed in order to obtain a SQL access token</param>
        /// <returns></returns>
        public override async Task<SqlAuthenticationToken> AcquireTokenAsync(SqlAuthenticationParameters parameters)
        {
            var authResult = await _tokenProvider.GetAuthenticationResultAsync("https://database.windows.net/").ConfigureAwait(false);

            return new SqlAuthenticationToken(authResult.AccessToken, authResult.ExpiresOn);
        }

        /// <summary>
        /// Implements virtual method in SqlAuthenticationProvider. Only Active Directory Interactive Authentication is supported.
        /// </summary>
        /// <param name="authenticationMethod">The SQL authentication method to check whether supported</param>
        /// <returns></returns>
        public override bool IsSupported(SqlAuthenticationMethod authenticationMethod)
        {
            return authenticationMethod == SqlAuthenticationMethod.ActiveDirectoryInteractive;
        }
    }

Кто-нибудь объяснит, почему это не удается, если управляемое удостоверение не сделано администратором sql?

2 ответа

Я думаю, что основная причина проблемы заключалась в том, что когда я вводил команду: CREATE USER [имя функции здесь] FROM EXTERNAL PROVIDER, хотя имя функции было написано правильно, регистр был неправильным.

Один из простых способов обойти ошибки такого рода — использовать GUID идентификатора функции вместо имени. Это тоже работает.

      CREATE USER [abcdef-1234-5678-ghijkl] FROM EXTERNAL PROVIDER
Другие вопросы по тегам