【问题标题】:Convert Entity Framework DB Connection to use Azure Identity using Powershell Credentials使用 Powershell 凭据将实体框架数据库连接转换为使用 Azure 标识
【发布时间】:2022-01-05 14:12:33
【问题描述】:

我们有一个设置为使用 EntityFramework 的应用程序。我需要更新该应用程序以使用 Azure Identity 访问数据库。基本上我需要做到以下几点:

  1. 使用 AzurePowershell 凭据获取访问令牌
  2. 使用该访问令牌创建 SQL 连接
  3. 将令牌添加到连接并返回给调用者

这是我到目前为止所拥有的(但我知道我在这里遗漏了很多东西,因为我遇到了编译错误)。我一直在寻找一些例子来做到这一点,但没有成功。

public static DbConnection CreateConnection( string efConnectionString )
        {

            var credential = new AzurePowerShellCredential();
            System.Threading.CancellationToken cancellationToken = default;
            TokenRequestContext requestContext = "https://database.windows.net/.default";
            string accessToken = AzurePowerShellCredential.GetToken( "https://database.windows.net/.default", cancellationToken );

            SqlConnectionStringBuilder sqlConnection = new SqlConnectionStringBuilder( efConnectionString );
            //create sql connection

            using( SqlConnection sqlConn = new SqlConnection( efConnectionString ) )
            {
                    sqlConn.AccessToken = accessToken;
            return sqlConn;
            }

对于初学者,requestContext 不喜欢被设置为字符串,我正在尝试找出将令牌添加到连接字符串并成功发送回的最佳方法。此外,AzurePowerShellCredential.GetToken 不喜欢我与数据库地址一起传递的字符串。 我传入的连接字符串如下所示:

"Server=tcp:servername.database.windows.net,1433;Database=databasename;User ID=UserID@servername;Password=password;Trusted_Connection=False;Encrypt=True;"

为了使其成功运行,我将省略上述连接字符串中的用户 ID 和密码,以便可以将其替换为 AzureCredentials。

我非常感谢可以提供的任何帮助。谢谢!

【问题讨论】:

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


    【解决方案1】:

    您的代码是正确的。我唯一建议的是使用DefaultAzureCredential,这将允许您对数据库使用不同的身份验证流程。

    连接字符串的格式可以如下:

    using Azure.Core;
    using Azure.Identity;
    using System.Data.SqlClient;
    
    var connString = "Server=tcp:<your-server-name>.database.windows.net,1433;Database=<database-name>;";
    
    var credential = new DefaultAzureCredential();
    var token = credential
        .GetToken(
            new TokenRequestContext(scopes: new[] { "https://database.windows.net/.default" })
        );
    
    using var conn = new SqlConnection(connString);
    conn.AccessToken = token.Token;
    
    conn.Open();
    

    您应该考虑的另一件事是访问令牌更新。 EntityFramework 缓存数据库连接,因此令牌可能会在连接处于活动状态时过期。作为一个选项,如果您有 ASP.NET 应用程序,我可以建议您使用现有解决方案,例如 this example,或者尝试逆向工程令牌更新逻辑,例如 Microsoft.Data.SqlClient (example)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      • 2015-07-27
      • 2020-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多