基于令牌的数据库身份验证失败,并显示“用户‘NT AUTHORITY\ANONYMOUS LOGON’登录失败”。

2024-01-09

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

用户“NT AUTHORITY\ANONYMOUS LOGON”登录失败。

这个问题已经讨论过了在 Stack Overflow 上 https://stackoverflow.com/questions/47506897/sql-aad-token-based-authentication-login-failed-for-user-nt-authority-anonymo and 在 MSDN 上 https://social.msdn.microsoft.com/Forums/vstudio/en-US/650cd289-ec7c-4108-a608-6476c4e97291/connecting-to-azure-sql-using-aad-access-token?forum=ssdsgetstarted,但没有可用的解决方案。这篇博文 https://blogs.msdn.microsoft.com/sqlsecurity/2015/09/28/examples-of-some-connection-errors-for-azure-active-directory-authentication/表明用户权限有问题,但相当模糊。

配置

获取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().

The 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有问题,还是数据库配置有问题。我还可以执行哪些其他诊断来找出此问题的原因?


结果发现这是一个非常小的错误:resource最后需要最后一个斜线。

所以而不是

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

它需要是

var resource = "https://database.windows.net/";
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于令牌的数据库身份验证失败,并显示“用户‘NT AUTHORITY\ANONYMOUS LOGON’登录失败”。 的相关文章

  • Azure 上的 SSAS 表格?

    我正在尝试部署 ssas 表格模型 我不知道我在做什么 我用VS2013在SQL Server 2008 R2上制作了多维 我想尝试将 Tabular 与 Power BI 结合使用 所以我设置了一个 SQL Azure DB 我有 Azu
  • 通过 Azure Active Directory 进行 FreeRADIUS 身份验证

    我刚刚配置了 FreeRadius 但我想对 Azure AD 中的用户进行身份验证 我知道可以将 FreeRADIUS 与 Active Directory 链接 但我找不到有关 Azure AD 的任何信息 有谁知道是否可能 一个可能的
  • 使用默认的 ASP.Net MVC 设置,如何使用 Microsoft 帐户登录?

    为什么我不断收到 输入参数 redirect uri 提供的值无效 我的网站托管在 Azure 中 我正在尝试通过 Microsoft 登录按钮登录 我并没有对默认的 ASP Net MVC 开箱即用模板进行太多更改 我真正改变的只是取消注
  • 如何在 Jupyter Notebook 内的 conda 环境中使用特定的 Java 版本

    我的总体目标是使用sparklyr在 Jupyter 实验室的 Azure 云服务上的 R Jupyter 笔记本中 我使用 R sparklyr 和 Java 8 创建了一个新的 conda 环境 因为这是 Sparklyr 支持的版本
  • Ember 数据保存方法,创建与更新

    我不明白 Ember 如何确定是否应该更新或创建记录 我认为它是基于 ID 或商店条目 但它似乎是其他东西 代码示例阐明了 this returns the user without making an api call currentUs
  • Polymer 1.0:用户身份验证 UX(建议、教程和示例)?

    是否有推荐的 聚合物方式 来进行用户身份验证 这个问题包括技术部分和用户体验 用于进行用户身份验证的用户体验的全面示例 和 或教程 将非常棒 注意 Polymer 入门套件不包含任何身份验证 UX 示例 在这个问题中 用户体验 的意思是 完
  • AWS Cognito 作为网站的 Django 身份验证后端

    我对 Cognito 的理解是 它可以用来代替本地 Django 管理数据库来对网站的用户进行身份验证 然而 我没有找到任何带有通过 Cognito 登录屏幕的基本 Hello World 应用程序的详细示例 如果有人可以发布一篇文章 逐步
  • 使用 azure 队列的 nservicebus 本地主机

    似乎所有附带的示例项目服务总线发送者和主机是 Web 角色和辅助角色 并通过角色入口点托管 的设置 我需要做这样的事情 Web 角色发送消息 gt 本地主机处理消息 是否可以将本地主机配置为仅使用 Azure 队列存储 而不是 MSMQ 我
  • Azure CloudBlob SetMetadata 失败,并显示“指定的元数据无效。其中包含不允许的字符。”

    我很确定这是 Windows Azure SDK 的限制 使用最新的 1 4 但必须有一种方法可以解决这个问题 而无需使用手动 REST 代码 CloudBlob blob container GetBlobReference url wo
  • 来自 IOS Xcode 的 Azure 推送通知错误

    我觉得我是世界上第一个尝试让 iOS 快速与 Azure 配合使用的人 但没有太多帮助 我跟着这个创建 iOS 应用程序 https azure microsoft com en us documentation articles app
  • 如何获取Azure帐户租户ID?

    我的问题是 是否可以在不使用 powershell 命令的情况下获取 azure Active Directory 租户 id 我找到了这两篇博客 在这个帮助下 我已经能够从 powershell 获取租户 ID 和订阅 ID 这是找回租客
  • 请确保至少一个领域可以验证这些令牌

    所以我把我的shiro设置为有两个Realms 用户名和密码领域 使用标准 UsernamePasswordToken 我还设置了一个自定义承载身份验证令牌 用于处理从用户传入的令牌 如果我只使用我的passwordValidatorRea
  • Azure 应用程序错误地请求管理员同意?

    我希望有人对我在Microsoft的Azure Portal中使用新注册的应用程序遇到的问题有所了解 portal azure com https portal azure com 当我收到以下对话框时 我的登录问题 右下角出现错误代码和消
  • 如何使用我的 DNS 服务器获取 Azure 容器实例?

    In ACI https learn microsoft com en us azure container instances container instances overview我们使用具有虚拟网络支持的 Linux 容器 我们运行
  • Firebase GAS webapp Google 弹出窗口消失

    我正在尝试升级我的 firebase GAS web 应用程序 之前我有一个弹出窗口 可以让用户使用 Google 登录 我不确定我做错了什么 但我已经升级到新的 firebase 现在正在尝试使用新的代码格式进行相同的登录 发生的情况是
  • 使用 Django REST 框架进行 SAML SSO 身份验证

    我目前正在开发 AngularJS 前端和 Django REST 后端 我一直在使用Django rest auth https github com Tivix django rest auth过去需要对两者之间的连接进行身份验证 但现
  • 在控制台应用程序中使用 SendGrid

    是否可以在 C 的控制台应用程序中使用发送网格 我的代码不起作用 我真的不知道为什么 你可以帮帮我吗 using System using System Net using System Net Mail using SendGrid na
  • Azure Function Blob 触发器 CloudBlockBlob 绑定

    当文件上传到 Blob 存储时 我会触发以下 Azure 函数 FunctionName ImageAnalysis public static async void Run BlobTrigger imageanalysis name C
  • MYSQL 区分大小写的 utf8 搜索(使用 hibernate)

    我的登录表具有 utf8 字符集和 utf8 排序规则 当我想要检查用户名并检索该特定用户名的其他信息时 hql 查询会为我提供小写和大写相同的结果 我应该如何处理适用于案例的 HQL 查询 我使用 Mysql 5 和 java hiber
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar

随机推荐