sqlcmd AAD 令牌身份验证失败,无法发现用户领域

sqlcmd AAD 令牌身份验证失败,无法发现用户领域

我正在尝试使用 AAD 用户帐户对 Azure SQL 数据库进行身份验证。根据文档我应该使用-G来启用 AAD 身份验证,然后通过 传递令牌-P。因此,我尝试使用来自 az 的令牌,如下所示(来自 git bash):

az account get-access-token --resource https://database.windows.net | jq -j .accessToken > @token
sqlcmd -S servername.database.windows.net -d databasename -G -P @token

但得到

Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Failed to authenticate the user 'jan.hudec' in Active Directory (Authentication option is 'ActiveDirectoryPassword').
Error code 0xCAA90018; state 10
Could not discover a user realm..

用户名明显错误。有什么方法可以告诉它领域吗?

当我解码令牌时,它正确地说

…"unique_name":"[email protected]","upn":"[email protected]"…

(注:实际域名、服务器和数据库名称已删除,其他部分均按原样保留)

我在 SQL Server Management Studio 中尝试使用 Azure Active Directory - Universal 和 MFA 身份验证,它显示了 AAD 登录对话框,然后连接,因此服务器应该配置正确。由于我是服务器 AAD 管理员组的成员,因此授予了权限。

答案1

使用 sqlcmd 进行连接帖子中,确保令牌格式正确,以便传入的 Azure SQL 服务在该端正确解释其值。此外,我引用了下面引用的帖子,并将与版本要求细节相关的重要句子加粗。

访问sqlcmd 实用程序下载最新版本sqlcmdMicrosoft Command Line Utilities 15 for SQL ServerMicrosoft 提供安装到您的系统上。

笔记:查看命令示例引用帖子的部分中有一个命令,该命令将令牌格式化为该帖子中概述的 UTF 格式。

使用 sqlcmd 进行连接

-G

客户端在连接到 SQL 数据库或 Azure Synapse Analytics 时使用此开关来指定使用 Azure Active Directory 身份验证对用户进行身份验证。它可以与以下选项结合使用-P使用访问令牌身份验证(v17.8+。此选项设置sqlcmd脚本变量 SQLCMDUSEAAD = true-G开关至少需要sqlcmd 版本17.6。要确定您的版本,请执行sqlcmd -?

-P

指定用户密码。与-G不带 的选项一起使用时-U,指定包含访问令牌的文件(v17.8+)。令牌文件应采用以下UTF-16LE (no BOM)格式。

访问令牌可以通过各种方法获取。确保访问令牌逐字节正确非常重要,因为它将按原样发送。以下是获取访问令牌的示例命令。该命令使用 Azure CLI 和 Linux 命令并将其保存到正确格式的文件中。如果系统或终端的默认编码不是 ASCII 或 UTF-8,则可能需要调整 iconv 选项。请务必小心保护生成的文件,并在不再需要时将其删除。

重要的

-G选项仅适用于 Azure SQL 数据库和 Azure Synapse Analytics。Linux 或 macOS 目前不支持 AAD 交互式身份验证。AAD 集成身份验证需要 SQL Server 版本 17.6.1 或更高版本的 Microsoft ODBC Driver 17 以及正确配置的 Kerberos 环境。

命令示例

az account get-access-token --resource https://database.windows.net --output tsv | cut -f 1 | tr -d '\n' | > iconv -f ascii -t UTF-16LE > /tmp/tokenFile

来源

答案2

Sqlcmd.exe 目前无法使用令牌与 AAD 配合使用。您可以使用用户主体通过 -U 进行连接,使其正常工作。

相关内容