【问题标题】:Entity framework throw connection error with azure SQL database with managed Identity实体框架与托管标识的 azure SQL 数据库发生连接错误
【发布时间】:2020-01-14 05:44:58
【问题描述】:

web config 中的连接字符串保存了用户名和密码,但我不想在 web config 中保存密码。

我在我的应用程序中使用实体框架。现在我正在尝试将 Azure SQL 数据库与托管标识一起使用。

我尝试使用文档中的Secure Azure SQL Database connection from App Service using a managed identity 教程

我在网络配置中的连接字符串:-

添加 name="Context" connectionString="metadata=res:///PubsuiteModel.csdl|res:///PubsuiteModel.ssdl|res://*/PubsuiteModel.msl;provider =System.Data.SqlClient;provider connection string="server=servername.database.windows.net;database=dbname;UID=AnyString;Authentication=Active Directory Interactive;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System. Data.EntityClient"

当我尝试从数据库中获取记录时,出现以下错误:-

错误:-底层提供程序在打开时失败。

InnerException = 无法实例化身份验证提供程序 类型 'Microsoft.Azure.Services.AppAuthentication.SqlAppAuthenticationProvider, Microsoft.Azure.Services.AppAuthentication' 用于 'ActiveDirectoryInteractive'。

如何使用托管标识的 Azure SQL 数据库为实体框架创建连接字符串?

【问题讨论】:

  • 现在已格式化。请投票。
  • @PanagiotisKanavos 你能分享链接吗?
  • 这是您使用的,但复制错误。您没有发布 您的 代码,也没有发布您尝试过的内容,或者即使您使用 ASP.NET 或 ASP.NET Core。该教程展示了如何使用 ASP.NET 或 ASP.NET Core。在这两种情况下,它都显示了如何添加必要的提供者。
  • 我正在使用 asp.net。我尝试过的是最初我使用 azure sql db 创建了实体框架。它将用户名和密码存储在网络配置中,但我不想要。所以我尝试了上面的链接,但是当我从数据库中获取任何记录时,它会抛出错误。
  • 您可以尝试将密码存储在keyvault中,这样更容易。

标签: c# entity-framework-6 azure-managed-identity


【解决方案1】:

您所指的指南很有帮助,但过于复杂。我自己也在为此苦苦挣扎。你要做的其实很简单(一旦你弄清楚了)。

首先,您的连接字符串显然应该没有任何类型的用户和密码,并且应该如下所示:

Server=tcp:<sql-server-name>.database.windows.net,1433;Initial Catalog=<sql-db-name>;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;

&lt;sql-server-name&gt;&lt;sql-db-name&gt; 替换为 Azure 中相应资源的名称。

将连接传递给 EF,而不是连接字符串。这是需要的,因为您需要添加访问令牌运行时。见下面的代码sn-p。

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{            
    var connection = new SqlConnection();
    connection.ConnectionString = dbConnString;

    var tokenProvider = new AzureServiceTokenProvider();
    var resourceId = "https://database.windows.net/";
    var token = tokenProvider.GetAccessTokenAsync(resourceId).ConfigureAwait(false).GetAwaiter().GetResult();
    connection.AccessToken = token;
    optionsBuilder.UseSqlServer(connection);                
}

不要忘记运行 SQL 命令以将您的托管身份和潜在的真实数据库用户绑定到数据库。

在 SQL server 资源上设置 AD admin 用户,并以此用户身份登录。

运行以下查询并将&lt;azure-resource-name&gt; 替换为您应用的 MI 名称。如果 MI 名称是系统分配的,则默认为应用名称。您可以使用主体用户名或 AAD 组名(例如 xxx@yyy.com 或“my-ad-group”)来代替 MI 名称。

CREATE USER "<azure-resource-name>" FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER "<azure-resource-name>";
ALTER ROLE db_datawriter ADD MEMBER "<azure-resource-name>";
ALTER ROLE db_ddladmin ADD MEMBER "<azure-resource-name>";
GO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    相关资源
    最近更新 更多