entity-framework-core - 使用 EF Core 的托管身份 Sql Auth - 用户登录失败'
问题描述
我有一个 dotnet 5(隔离)Azure Function 应用程序,它需要通过 EF Core 5 访问 Azure Sql Server 数据库。我想在发出 sql server 请求时使用函数应用程序的托管标识。
我试过的
我按照这里的说明进行操作。
我创建了一个名为“smsrouterdb”的新 AD 帐户,并将其设为 Azure Sql Admin。我的函数应用程序的名称是“func-smsrouter-msdn-01”。因此,在通过 SSMS 以“smsrouterdb”身份登录数据库后,我创建了一个包含的用户,如下所示:
CREATE USER [func-smsrouter-msdn-01] FROM EXTERNAL PROVIDER
ALTER ROLE db_datawriter ADD MEMBER [func-smsrouter-msdn-01]
ALTER ROLE db_datareader ADD MEMBER [func-smsrouter-msdn-01]
然后我通过 http 请求触发了我的函数应用程序。
发生了什么
我从函数应用程序中收到以下错误:
发生一个或多个错误。(键“身份验证”的值无效。)---> System.ArgumentException:键“身份验证”的值无效。在 Microsoft.Data.Common.DbConnectionStringBuilderUtil.ConvertToAuthenticationType(字符串关键字,对象值)
我意识到这是因为引用了旧版本的 nuget 包 Microsoft.Data.SqlClient。因此,我明确添加了对 v3.0.0 的引用。
然后我收到以下错误
用户“<token-identified principal>”登录失败
但是,如果我将连接字符串的身份验证属性更改为“Active Directory Interactive”并使用以下命令将函数应用的托管标识的对象 ID 提升为 Sql Admin:
az sql server ad-admin create --resource-group <tg name> --server-name <server name> --display-name MSIAzureAdmin --object-id "id of managed identity here"
然后行被正确写入。我担心的是托管身份不需要是 sql 管理员。
配置
包含 dbcontext 的项目的 nuget 包是:
"Microsoft.Azure.Services.AppAuthentication" Version="1.6.1"
"Microsoft.EntityFrameworkCore" Version="5.0.6"
"Microsoft.EntityFrameworkCore.Design" Version="5.0.6"
"Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.6"
"WindowsAzure.Storage" Version="9.3.3" />
在主 Azure Function 项目中,我引用了以下 nuget 包:
Microsoft.Data.SqlClient 3.0.0
Serilog.Sinks.MSSqlServer 5.6.0
我的数据库上下文中的唯一代码是:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
SqlConnection connection = new SqlConnection();
logger.LogInformation($"SqlSvrConString=[{sharedConfig[ConfigConstants.SqlSvrConnString]}]");
connection.ConnectionString = sharedConfig[ConfigConstants.SqlSvrConnString];
optionsBuilder.UseSqlServer(connection);
}
我的连接字符串是:
服务器=servernamehere.database.windows.net;初始目录=dbnamehere;身份验证=Active Directory 托管标识;
任何人都可以解释为什么这会失败,除非托管身份是 sql admin 吗?
解决方案
我认为问题的根本原因是当我发出命令时:CREATE USER [function name here] FROM EXTERNAL PROVIDER,虽然函数名拼写正确,但大小写不正确。
推荐阅读
- python - 使用特殊字符 MySQL python
- c++ - 在OpenGL中更改相机位置和方向?
- typescript - 打字稿通用函数接受具有第一个参数作为键的对象
- apache-spark - 如果立即读取数据,则火花结构化流读取到 hdfs 文件失败
- botframework - 让 Skype 通过对话 ID 发布到群组对话
- node.js - kotlin multiplateforme to js:生成 package.json
- dart - 从 KeyPair Generation Flutter 获取 RSA 公钥或私钥
- r - 将日期范围与单个分类变量匹配
- php - 正则表达式过滤 BBCode 列表
- amazon-web-services - puppet 在哪里提取主机名信息来命名 ssl 目录中的证书?