我想使用托管身份(即连接到 Visual Studio 的用户的身份,而不是在我的连接字符串中提供 UserId 和密码)从在我的机器上执行的 Azure 函数中查询 Azure SQL 数据库。
我按照Microsoft 文档上的本教程进行操作,因此我的 Azure SQL Server 有一个 AD 用户作为管理员,它允许我向使用我的 Azure 函数标识和其中的用户(以及我的函数应用程序)创建的 Azure AD 组授予权限(db_datareader)部署在 Azure 中)。
如果我在 Azure 中部署并运行我的 Azure Function,它能够查询我的数据库并且一切正常。但是当我在本地运行 Azure Function 时,出现以下错误:
用户“NT AUTHORITY\ANONYMOUS LOGON”登录失败。
我的函数代码如下:
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = "test")] HttpRequest req,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
using (var connection = new SqlConnection(Environment.GetEnvironmentVariable("sqlConnectionString")))
{
connection.AccessToken = await (new AzureServiceTokenProvider()).GetAccessTokenAsync("https://database.windows.net");
log.LogInformation($"Access token : {connection.AccessToken}");
try
{
await connection.OpenAsync();
var rows = await connection.QueryAsync<Test>("select top 10 * from TestTable");
return new OkObjectResult(rows);
}
catch (Exception e)
{
throw e;
}
}
}
代码正确检索令牌,错误发生在线await connection.OpenAsync()
。
如果我在 Azure Data Studio 中使用与连接到 Visual Studio 的用户相同的用户(该用户是具有数据库权限的 AD 组的成员)打开数据库,我可以毫无问题地连接和查询数据库。
这是一个已知问题还是我在这里遗漏了什么?