azure之基于 token 的数据库身份验证失败,错误代码为 "Login failed for user ' NT AUTHORITY\ANONYMOUS LOGON'。”

webabcd 阅读:62 2024-07-26 13:47:55 评论:0

我在基于 token 的数据库身份验证工作时遇到问题。使用 Active Directory 密码连接可以正常工作,但是当使用 token 连接时,我收到以下错误:

Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.

这个问题已经讨论过here on Stack Overflowhere 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.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号