使用身份验证的EF Core 3.1 =集成Active Directory

时间:2020-06-03 06:11:06

标签: entity-framework-core azure-sql-database azure-web-app-service

[更新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

3 个答案:

答案 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应用程序不支持ActiveDirectoryIntegratedActiveDirectoryInteractive身份验证选项。

原因是从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'? #374SqlAuthenticationMethod枚举的文档-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