0

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

  1. 使用 AzurePowershell Credentials 获取访问令牌
  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。

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

4

1 回答 1

0

你的代码是正确的。我建议的唯一方法是使用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 应用程序,我可以建议您使用本示例Microsoft.Data.SqlClient中的现有解决方案,或者尝试像(示例)中那样对令牌更新逻辑进行逆向工程

于 2022-01-09T16:30:22.353 回答