azure之基于 token 的数据库身份验证失败,错误代码为 "Login failed for user ' NT AUTHORITY\ANONYMOUS LOGON'。”
我在基于 token 的数据库身份验证工作时遇到问题。使用 Active Directory 密码连接可以正常工作,但是当使用 token 连接时,我收到以下错误:
Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.
这个问题已经讨论过here on Stack Overflow和 here on MSDN ,但没有可用的解决方案。 This blog post表明用户权限有问题,但相当模糊。
配置
获取token成功,方法如下:
static async Task<string> GetAccessToken()
{
var certificateSDN = "redacted";
var tenantId = "redacted";
var clientId = "redacted";
var resource = "https://database.windows.net";
X509Certificate2 certificate;
using (var certificateStore = new X509Store(StoreName.My, StoreLocation.CurrentUser))
{
certificateStore.Open(OpenFlags.ReadOnly);
certificate = certificateStore.Certificates
.Find(X509FindType.FindBySubjectDistinguishedName, certificateSDN, false)
[0];
}
var authenticationContext = new AuthenticationContext($"https://login.microsoftonline.com/{tenantId}");
var clientAssertionCertificate = new ClientAssertionCertificate(clientId, certificate);
var authenticationResult = await authenticationContext.AcquireTokenAsync(resource, clientAssertionCertificate);
return authenticationResult.AccessToken;
}
连接到数据库是这样完成的:
var connectionStringBuilder = new SqlConnectionStringBuilder()
{
DataSource = "redacted.database.windows.net",
InitialCatalog = "redacted",
};
using (var sqlConnection = new SqlConnection(connectionStringBuilder.ConnectionString))
{
sqlConnection.AccessToken = accessToken;
sqlConnection.Open();
}
调用sqlConnection.Open()
时发生错误。
clientId
与应用注册的应用 ID 匹配。我已在数据库中创建了一个用户,与应用程序注册的名称相匹配,并使用以下查询:
create user [redacted] from external provider
go
exec sp_addrolemember N'db_datareader', N'redacted'
exec sp_addrolemember N'db_datawriter', N'redacted'
诊断
通过以下查询,我检查用户是否具有角色并有权连接到数据库:
declare @user nvarchar(max);
set @user = 'redacted'
select
u.name
,r.name
from
sys.database_role_members as m
inner join sys.database_principals as r on m.role_principal_id = r.principal_id
inner join sys.database_principals as u on u.principal_id = m.member_principal_id
where
u.name = @user;
select
class_desc
,major_id
,permission_name
,state_desc
from
sys.database_permissions
where
grantee_principal_id = user_id(@user);
这是输出:
redacted db_datareader
redacted db_datawriter
DATABASE 0 CONNECT GRANT
尝试使用虚假 token 连接会出现相同的错误。所以我不知道是我的token有问题,还是数据库配置有问题。我还可以执行哪些其他诊断来找出此问题的原因?
请您参考如下方法:
事实证明这是一个非常小的错误:resource
需要在末尾添加一个斜杠。
所以而不是
var resource = "https://database.windows.net";
必须是
var resource = "https://database.windows.net/";
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。