我有一个分配了 user assigned managed identity 的功能应用程序,它使用该应用程序连接到SQL数据库。几天后一切正常,但随后突然停止工作,未对db或功能应用程序进行任何更改。
Error: Login failed for user '<ClientId>@<TenantId>'.
我在线搜索,发现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>];
有什么指针可以指向下一个地方吗?
注意:
答案 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对此工作。因此,基本上我得出的结论是我的主要学生有问题,不确定到底是什么。
所以我决定重新创建数据库: