[更新1]
我可以使用以下连接字符串使其工作
Server=tcp:mydatabaseserver.database.windows.net,1433;Initial Catalog=mydbname
并实现this article中提到的拦截器。
这证明Azure已正确配置,并且问题出在应用程序中的某个位置(可能是缺少软件包?)。
无论如何,我仍然希望能够更改连接字符串并在AAD身份验证和sql身份验证之间切换,而无需在应用程序中添加其他逻辑。
[/更新1]
我正在Azure WebApp上使用 EF Core 3.1.4 ,我想使用分配给应用程序的Azure AD身份进行身份验证,但是遇到以下异常:< / p>
ArgumentException: Invalid value for key 'authentication'.
Microsoft.Data.Common.DbConnectionStringBuilderUtil.ConvertToAuthenticationType(string keyword, object value)
这是连接字符串:
{
"ConnectionStrings": {
"Admin": "Server=tcp:mydatabaseserver.database.windows.net,1433;Initial Catalog=mydbname;Authentication=Active Directory Integrated"
}
}
我使用以下代码初始化上下文:
var connectionString = this.Configuration.GetConnectionString("Admin");
services.AddDbContext<NetCoreDataContext>(builder => builder.UseSqlServer(connectionString));
Microsoft.Azure.Services.AppAuthentication
程序包也已导入(版本 1.5.0 )
答案 0 :(得分:0)
更新
如果您使用Azure MSI,请阅读此文档。
https://docs.microsoft.com/en-us/azure/app-service/app-service-web-tutorial-connect-msi
重要
您的问题可能未在门户中配置。您可以按照the offical document完成操作,然后重试。
首先,您需要创建可能需要花费很长时间的SQL托管实例。然后,您需要配置Active Directory admin
和您的db
。完成后,您将在门户网站的ADO.NET(Active Directory password authentication)
中找到SQL database ->Connection strings
。您可以将其复制并粘贴到代码中以解决该问题。
我自己尝试过,它对我有用。有关更多详细信息,请参见this post。
答案 1 :(得分:0)
欢迎来到Net框架/运行时地狱。
当前,NetCore应用程序不支持ActiveDirectoryIntegrated
和ActiveDirectoryInteractive
身份验证选项。
原因是从EF Core uses Microsoft.Data.SqlClient instead of System.Data.SqlClient v3.0开始。目前,Microsoft.Data.SqlClient的最新版本(也是预览版本)仅针对NET Framework支持这两个选项。
您可以在他们的问题跟踪器Why does SqlClient for .Net Core not allow an authentication method 'Active Directory Interactive'? #374和SqlAuthenticationMethod枚举的文档-ActiveDirectoryIntegrated
中看到类似的问题(重点是我的):
身份验证方法使用Active Directory集成。使用集成的Active Directory通过集成的Windows身份验证连接到SQL数据库。 仅适用于.NET Framework应用程序。
话虽如此,请使用Authentication
解决方法,或等待最终为Net Core实施此选项。
答案 2 :(得分:0)
Active Directory Integrated在.NET Core 3.1中不适用于我,但是自从我安装了NuGet包Microsoft.Data.SqlClient(我安装了v2.0.1版)以来,它就一直可以使用。现在,它可以与以下连接字符串一起使用:
“ MyDbConnStr”:“服务器= tcp:mydbserver.database.windows.net,1433;数据库= MyDb;身份验证= ActiveDirectoryIntegrated”
注意:如果我在像这样的单词之间留有空格,它也可以工作:
“ MyDbConnStr”:“服务器= tcp:mydbserver.database.windows.net,1433;数据库= MyDb;身份验证=集成了Active Directory”
如果我包含这样的转义引号,它也会起作用:
“ MyDbConnStr”:“服务器= tcp:mydbserver.database.windows.net,1433;数据库= MyDb;身份验证=”集成了Active Directory“”
最后,请注意,还有一些其他属性也可以在连接字符串中使用:
;用户ID=myruntimeuser@mydomain.com;持久安全信息= true;加密= true; TrustServerCertificate = true; MultipleActiveResultSets = true