使用应用服务和 Azure SQL 的用户分配身份是否有效?

Sve*_*ven 4 azure-managed-identity

我正在尝试让应用服务与 Azure Sql 数据库连接。我可以用相同的代码 git 很好地使用系统分配的身份,但我更喜欢使用用户分配的身份 (UAI),但我无法让它工作。

我做的步骤:

  1. 通过门户创建了一个 UAI,UAI 的名称为“uai-dev-appname-001”
  2. 在 Azure 应用服务的标识选项卡中,我选择了“用户分配的标识”并选择了在上一步中创建的 UAI。
  3. 运行以下 SQL CMD
CREATE USER [uai-dev-appname-001] FROM EXTERNAL PROVIDER
ALTER ROLE db_datareader ADD MEMBER [uai-dev-appname-001]
ALTER ROLE db_datawriter ADD MEMBER [uai-dev-appname-001]
Run Code Online (Sandbox Code Playgroud)
  1. 将 ASP.NET 中的 Connectionstring 设置为:

    数据源=sqlsrv-name-dev-001.database.windows.net; 初始目录=sqldb-name-dev-001;

  2. 在我的 ASP.NET Core 中使用以下代码:
SqlConnection connection = new SqlConnection
{
   ConnectionString = configuration.GetConnectionString("nameDatabase")
};
AzureServiceTokenProvider provider = new AzureServiceTokenProvider();
var token = provider.GetAccessTokenAsync("https://database.windows.net/").Result;
connection.AccessToken = token;
Run Code Online (Sandbox Code Playgroud)
  1. 部署到 Azure 应用服务并查看 URL。结果是:错误500.30
  2. 查看应用程序事件日志:

    未处理的异常。System.AggregateException:发生一个或多个错误。(参数:连接字符串:[未指定连接字符串],资源:https : //database.windows.net,权限:。异常消息:尝试了以下 3 种方法来获取访问令牌,但没有一个有效。参数:连接字符串:[未指定连接字符串],资源:https : //database.windows.net, 权威: 。异常消息:尝试使用托管服务标识获取令牌。无法获取访问令牌。收到不可重试的错误。MSI ResponseCode: BadRequest, Response: {"StatusCode":400,"Message":"No MSI found for specified ClientId/ResourceId.","CorrelationId":"a68bf757-518a-42e1-85a9-342320d39b5a"} 参数:连接字符串:[未指定连接字符串],资源:https : //database.windows.net,权限:。异常消息:尝试使用 Visual Studio 获取令牌。无法获取访问令牌。在“D:\local\LocalAppData.IdentityService\AzureServiceAuth\tokenprovider.json”中找不到 Visual Studio 令牌提供程序文件参数:连接字符串:[未指定连接字符串],资源:https://database。,权限:。异常消息:尝试使用 Azure CLI 获取令牌。无法获取访问令牌。'az' 不是内部或外部命令,也不是可运行的程序或批处理文件。

IMO 中最有趣的部分是:

响应:{"StatusCode":400,"Message":"未找到指定 ClientId/ResourceId 的 MSI。","CorrelationId":"a68bf757-518a-42e1-85a9-342320d39b5a"}

我的问题是:

  • 用户分配的身份是否适用于 Azure SQL?
  • 如果是这样,我做错了什么?
  • 有人有一个有效的例子吗?

Var*_*rma 12

Microsoft.Azure.Services.AppAuthentication 1.2.1 版支持用户分配的托管标识。

因此,请将 Microsoft.Azure.Services.AppAuthentication 的版本更新为最新版本。

然后在 AppService 的 Appsettings 中设置AzureServicesAuthConnectionStringRunAs=App;AppId={ClientId of user-assigned identity}

例如

RunAs=App;AppId=587f16c8-81ed-41c7-b19a-9ded0dbe2ca2
Run Code Online (Sandbox Code Playgroud)

文档可以在这里找到。

完成这些步骤后,您的代码应该使用用户分配的托管标识。

  • 谢谢。这就像一个魅力。不幸的是,Microsoft IMO 没有详细记录。 (4认同)