',entity-framework-core,azure-functions,azure-sql-database,azure-identity"/>

首页 > 解决方案 > 使用 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 吗?

标签: entity-framework-coreazure-functionsazure-sql-databaseazure-identity

解决方案


我认为问题的根本原因是当我发出命令时:CREATE USER [function name here] FROM EXTERNAL PROVIDER,虽然函数名拼写正确,但大小写不正确。


推荐阅读