用户分配的托管身份“用户登录失败”的SQL Azure连接错误

时间:2020-05-06 19:58:24

标签: sql-server azure-sql-database azure-web-app-service azure-function-app azure-managed-identity

我有一个分配了 user assigned managed identity 的功能应用程序,它使用该应用程序连接到SQL数据库。几天后一切正常,但随后突然停止工作,未对db或功能应用程序进行任何更改。

Error: Login failed for user '<ClientId>@<TenantId>'.
  • ClientId :为用户分配的托管身份的ClientId。
  • 租户ID :此身份所在的租户。

我在线搜索,发现ways sys.event_log 中调查了更详细的错误。这样,我看到错误是18456,状态是68。不幸的是,错误18456的状态68没有记录在任何地方。 (Official doc)。

这是我创建SqlConnection的方式(请注意,这以前曾经起作用,并且相同的代码在相同的精确设置下也可以正常工作):

SqlConnection connection = new SqlConnection("Server=tcp:myserver.database.windows.net,1433;Database=MyDb;");
connection.AccessToken = await new AzureServiceTokenProvider("RunAs=App;AppId=<ClientId>").GetAccessTokenAsync("https://database.windows.net/");

用户是使用以下命令在db中创建的:

CREATE USER [<Name of user assigned identity>] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [<Name of user assigned identity>];
ALTER ROLE db_datawriter ADD MEMBER [<Name of user assigned identity>];

有什么指针可以指向下一个地方吗?

注意:

  1. 使用Azure Function Runtime 2.0(dotnet核心)
  2. 使用Microsoft.Azure.Services.AppAuthentication 1.4.0(最新稳定版)。

1 个答案:

答案 0 :(得分:1)

我找不到根本原因,但是我正在发布使我不受阻碍的内容,以便希望将来对其他人有所帮助。

由于某种原因,所有形式的身份验证(服务器的AAD管理员除外)在此服务器上均失败。因此,不仅用户分配的身份验证失败(在上面的问题中进行了描述),而且contained user身份验证也失败了。从db中删除用户分配的标识并重新添加是行不通的:

DROP USER [<Name of user assigned identity>];
CREATE USER [<Name of user assigned identity>] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [<Name of user assigned identity>];
ALTER ROLE db_datawriter ADD MEMBER [<Name of user assigned identity>];

类似地,删除包含的用户并重新创建也不起作用。

DROP USER [ContainedUser];
CREATE USER [ContainedUser] WITH PASSWORD='******';
ALTER ROLE db_owner ADD MEMBER [ContainedUser];

我还注意到辅助服务器(即副本)工作正常,而auth对此工作。因此,基本上我得出的结论是我的主要学生有问题,不确定到底是什么。

所以我决定重新创建数据库:

  • 我已将故障转移到辅助服务器。
  • 删除复制链接,然后删除故障服务器。 (仅删除数据库并执行下面的其余步骤是不够的,我确实尝试过)
  • 重新创建服务器。
  • 重新配置复制,以便在新服务器上将数据库创建为辅助数据库。
  • 进行了另一个故障转移,以便新创建的数据库成为主数据库。
  • 所有身份验证正常。