我正在使用实体框架连接到Azure SQL数据库,并且我正在使用访问令牌(通过托管标识获得)进行连接。
我没有在SQL连接字符串中使用用户名和密码,而是使用托管身份并将SQL连接字符串保存在Azure密钥库中。
我用如下所示的令牌连接到数据库,但一个小时后它就过期了,所以我得到了"SQL登录失败-";错误。
连接数据库后,我有一个长时间运行的过程,它从一些表中收集一些配置数据,超过45分钟后,我需要更新数据库中的数据。当尝试使用dbcontext
保存更改时,代码会引发此超时问题。
如何获取新的刷新令牌并设置为连接?
public SqlConnection GetDBConnection()
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString = Environment.GetEnvironmentVariable("SqlConnectionString");
var credential = new DefaultAzureCredential();
var accessToken = credential.GetToken(new TokenRequestContext(new[] { "https://database.windows.net/.default" }));
conn.AccessToken = accessToken.Token;
return conn;
}
我们需要确保在作业完成之前连接不会关闭,并且在令牌部分,当我们运行长流程时遇到任何连接问题时,连接可能会过期。
因此,我们在评论部分获得了一些使用"USING"的见解。这是可以做到的。
以下是我们如何将其用于连接,主要用于SQL:
using (SqlConnection conn = new SqlConnection(...))
{
using(SqlCommand cmd = new SqlCommand(..., conn))
{
conn.Open();
using(DataReader dr = cmd.ExecuteReader()) // or load a DataTable, ExecuteScalar, etc.
{
...
{
}
}
还可以使用Azure SQL数据库检查AAD身份验证,因为我们已经看到令牌标识的主体。