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