【发布时间】:2020-06-04 12:30:56
【问题描述】:
我正在尝试让应用服务连接到 Azure Sql 数据库。我可以 git 很好地使用具有相同代码的系统分配标识,但我更喜欢使用用户分配标识 (UAI),但我无法让它工作。
我做的步骤:
- 通过门户创建了一个 UAI,UAI 的名称为“uai-dev-appname-001”
- 在 Azure 应用服务的“身份”选项卡上,我选择了“用户分配的身份”并选择了在上一步中创建的 UAI。
- 运行以下 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]
- 将 ASP.NET 中的 Connectionstring 设置为:
数据源=sqlsrv-name-dev-001.database.windows.net;初始目录=sqldb-name-dev-001;
- 在我的 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;
- 部署到 Azure 应用服务并查看 URL。结果是:错误500.30
- 查看应用程序事件日志:
未处理的异常。 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.windows.net,权限:。异常消息:尝试使用 Azure CLI 获取令牌。无法获取访问令牌。 'az' 未被识别为内部或外部命令, 可运行的程序或批处理文件。
IMO 中最有趣的部分是:
响应:{"StatusCode":400,"Message":"未找到指定 ClientId/ResourceId 的 MSI。","CorrelationId":"a68bf757-518a-42e1-85a9-342320d39b5a"}
我的问题是:
- 用户分配的身份是否适用于 Azure SQL?
- 如果是这样,我做错了什么?
- 有人有工作示例吗?
【问题讨论】:
-
即使我无法让用户管理的身份连接与 AppService 一起使用。但根据以下链接 - docs.microsoft.com/en-us/azure/app-service/…,您必须在使用用户管理身份时提及 clientid。如果您设法使用它破解,请告诉我。
-
我没有使用 REST 协议来获取令牌,而是使用 Microsoft.Azure.Services.AppAuthentication 中提到的 TIP 作为您提到的文章中的代码示例。我不知道如何使用 Microsoft.Azure.Services.AppAuthentication 将 clientId 添加到调用中