基于令牌的数据库认证失败,显示“登录失败,用户为'NT AUTHORITY\ANONYMOUS LOGON'”。

3
我遇到了令牌数据库认证的问题。使用Active Directory密码进行连接可以,但是使用令牌连接时,会收到以下错误消息:
“用户'NT AUTHORITY\ANONYMOUS LOGON'的登录失败。”
这个问题已经在Stack OverflowMSDN上进行了讨论,但没有可用的解决方案。这篇博客文章表明用户权限出了问题,但描述比较模糊。

配置

使用下列方法成功获取了令牌:
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

尝试使用伪令牌连接会产生相同的错误。因此,我不知道我的令牌是否有问题,还是数据库配置有问题。我可以执行哪些其他诊断来找到问题的原因?
1个回答

10

结果证明这只是一个非常小的错误:resource需要在结尾处加上斜杠。


所以,与其写成

var resource = "https://database.windows.net";

它需要被

var resource = "https://database.windows.net/";

4
Off by one [character] errors...drive me nuts. 转化为中文是:只差一个字符的错误会让我发疯。谢谢你帮我解决了这个问题,也同样解决了我的问题。 - H Boyce

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接