基于令牌的数据库身份验证失败,并显示“用户‘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’登录失败”。 的相关文章

  • 将多个 Blob 输入传递到 QueueTrigger Azure 函数的最佳方法

    问题 触发后 生成 3 个 XML 文件 完成后将它们通过 ftp 传输到站点 目前的方法 我有一个 HTTP 触发器 Azure 函数 运行时将构造 3 个 XML 文件并将它们保存到 Azure 存储 Blob 容器中 由于有多个输出
  • 应用程序网关如何防止请求发送到最近终止的 Pod?

    我目前正在 Azure 中研究和试验 Kubernetes 我正在使用 AKS 和应用程序网关入口 据我了解 当 Pod 添加到服务时 端点会更新 入口控制器会不断轮询此信息 随着新端点的添加 AG 也会更新 当它们被移除时 AG 也被更新
  • 使用 SimpleMembership 获取用户信息

    仍在尝试使用 MVC4 来掌握新的 SimpleMembership 我更改了模型以包含名字和姓氏 效果很好 我想更改登录时显示的信息 而不是在视图中使用 User Identity Name 我想做类似 User Identity For
  • 从 ADLS2 传输到计算目标的速度非常慢 Azure 机器学习

    在计算目标上执行训练脚本期间 我们尝试从 ADLS2 数据存储区下载已注册的数据集 问题是需要hours使用以下方法将 1 5Gb 分成 8500 个文件 下载到计算目标 from azureml core import Datastore
  • 如何授予将网站发布到 Azure 的权限?

    如何授予某人将 ASP NET MVC 网站发布到 Azure 的权限 而无需交出我的个人凭据 使用新的 Azure 资源管理器 ARM 您可以使用基于角色的访问控制 RBAC 授予用户对您拥有的特定 Azure 资源的特定访问权限 有 3
  • 使用 JWT 通过 Asp.net core 进行 GraphQL 身份验证

    我正在使用 NET 的 GraphQL https www nuget org packages GraphQL 2 0 0 alpha 912graphql 的包 但我无法理解如何在 graphql 查询或突变中使用 JWT 进行身份验证
  • System.Security.Claims 命名空间的成员不可用?

    我正在学习 NET 4 5 中新的基于声明的身份验证方法 并使用控制台应用程序来执行此操作 根据 MSDNhere http msdn microsoft com en us library system security claims c
  • Azure 函数和缓存

    我们计划开发一个 Azure 函数 其输入触发器是服务总线消息 输出是 blob 存储 服务总线消息将包含图像 url 该函数会将图像大小调整为预定义的分辨率 并将上传到 azure blob 存储 图像大小应调整到的分辨率存储在数据库中
  • 如何使用多个Auth组件?

    我使用用户模型将身份验证组件配置为 管理页面 但现在 我还想为客户端创建 配置身份验证 我尝试 重写 inialize This is in my ClientsController php public function initiali
  • 使用 Microsoft Graph 创建用户

    如何使用 Microsoft graph 创建用户 因为我在保存过程中遇到了权限失败的问题 我确实有几个问题 在图中调用创建用户 API 将在哪里创建用户 是在 Azure AD 还是其他地方 我尝试通过传递 json 和必需的标头来调用创
  • 将 Jabber/XMPP 与其他系统集成(身份验证、密码共享)

    是否可以指示 jabber xmpp 服务器将身份验证委托给另一个模块 我们正在使用 XMPP 构建一个内部应用程序 如果我们能让用户保留他们在我们的 Web 应用程序中使用的标准用户名 密码 那就太好了 网络应用程序当前正在对密码进行哈希
  • if() 函数如何在 Azure 资源管理器模板中执行

    我在用if 我的 ARM 模板中的函数可以有条件地在我的 Web 应用程序资源中设置一些连接字符串值 目前的情况是这样的 if equals parameters isProduction Yes concat variables redi
  • JWT 中的注销不起作用

    我是 Laravel 的新手 我安装了 JWT 并登录 所以它工作并生成了一个令牌 当我在邮递员中注销时它返回 true 但一次又一次它返回 true 和 auth gt 用户 注销后始终返回用户 这是我的代码 public functio
  • 通过 Nuke.Common/NuGet.CommandLine 部署 NuGet 包时如何通过 Azure Auth

    我正在尝试通过 Azure DevOps 上的 Nuke 和 CI CD 自动执行 NuGet 包更新 一切都构建得很好 但在 PushNuGet 步骤中 该过程尝试通过弹出窗口向 Azure 进行身份验证 这显然从未在 in devops
  • 为 ASP.NET MVC 实现自定义登录

    我是 ASP NET MVC 的新手 需要一些关于如何实现以下内容的建议 该站点是一个使用率很高的站点 内部 内联网 约有 200 个用户 我们使用表单身份验证来访问 SQL Server DB 不是 Windows 集成 有些操作受到保护
  • 无需域名即可登录 Azure Active Directory

    我们希望使用 Azure Active Directory 作为面向外部的应用程序的用户存储 目前 我们的 MVC C 4 5 应用程序 使用 WIF 正在通过被动联合对本地 ADFS 2 0 代理 服务器进行身份验证 我们希望将其 移植
  • 尽管低于配额,但无法在 Azure 中创建新的服务主体

    尽管低于配额 但我无法在 Azure 中创建任何新的 SP 如果我运行 az ad sp create for rbac I get The directory object quota limit for the Principal ha
  • yesod——密码保护临时站点

    我正在尝试设置 yesod 网络服务器的临时实例 我想知道是否有一些简单的方法可以使整个站点受到密码保护 具体来说 我希望能够提示那些导航到我的网站的人提供凭据 经过身份验证后 它应该像典型站点一样运行 但如果他们无法验证自己的身份 他们就
  • Azure WebJob QueueTrigger 重试策略

    我想让我的队列每 90 分钟重试一次失败的网络作业 并且只尝试 3 次 创建队列时我使用以下代码 CloudQueueClient queueClient storageAccount CreateCloudQueueClient IRet
  • Azure Function App Azure 服务总线触发器触发两次

    我使用带有服务总线触发器的 Azure Function Apps 来读取服务总线并对服务总线消息的内容执行操作 服务总线接收 JSON 序列化对象 然后将 JSON 消息反序列化回 Function App 中的对象 然而 由于某种原因

随机推荐