连接到Azure SQL数据库AAD的Azure管道-用户'<令牌标识的主体>

时间:2020-06-23 11:56:46

标签: azure azure-devops azure-sql-database

我正在尝试使用AAD帐户连接到Azure SQL数据库,这是Azure管道的一部分。大概我有以下内容:

具有关联服务连接的Azure管道。 将AAD管理员设置为服务主体(连接的主体)的Azure SQL数据库。 一个Azure CLI任务,获取服务主体的承载令牌。

然后,我有了一个使用承载令牌连接到数据库的Azure Powershell脚本:

$conn = new-object System.Data.SqlClient.SqlConnection
$conn.ConnectionString = "Server=tcp:$($sqlServer),1433;Initial Catalog=$($sqlDB);Persist Security Info=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;" 
$conn.AccessToken = $env:ACCESSTOKEN
$conn.Open()

这将导致以下错误:

Login failed for user '<token-identified principal>

运行管道的代理允许通过SQL Server防火墙。

在数据库日志中,错误代码为18456,状态为132(AAD失败)。

我已经使用服务连接服务主体登录Azure Azure CLI进行了手动测试,请求承载令牌,然后连接到数据库(使用上面的代码),并且可以正常工作。

如果我比较管道测试和Azure CLi手动测试的承载令牌,则它们是相同的(除了exp,uti和aio)

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

根据this doc

此身份验证方法允许中间层服务获取JSON Web令牌(JWT)

您需要使用id_token来进行Azure AD身份验证。从您的脚本看来,您似乎正在使用管道环境访问令牌。

另一方面,您可以导航到 Azure Portal-> Azure Sql->查询编辑器页面。 然后,您可以选择Active Directory authentication并检查是否可以成功登录数据库。

Azure Sql

如果您在此页面中遇到问题Login failed for user '<token-identified principal>, 您可以尝试在SQL Server或create contained users mapped to Azure AD identities上将目标帐户添加为Active Directory admin

AAD admin

此外,您还可以使用Azure AD帐户和密码登录Azure SQL。

脚本:

$conn = new-object System.Data.SqlClient.SqlConnection
$conn.ConnectionString = "Server=tcp:$($sqlServer),1433;Initial Catalog=$($sqlDB);Persist Security Info=False;User ID:User account;Password=Password;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Authentication=Active Directory Password;" 
$conn.Open()

更新

对于访问令牌:

您可以尝试在Azure Clould shell中运行Azure CLI命令:

az login

az account get-access-token --resource https://database.windows.net

然后您可以获取访问令牌。

Access token

根据我的测试,如果您使用此Access令牌连接Azure Sql,它可以按预期工作。

更新2:

获取它。如果将服务主体设置为AD Admin。 手动服务主体类型服务连接可以正常工作。

Manual

例如:

- task: AzureCLI@2
  displayName: 'Azure CLI '
  inputs:
    azureSubscription: manual service connection name
    scriptType: ps
    scriptLocation: inlineScript
    inlineScript: |
     
     az account get-access-token --resource https://database.windows.net
  enabled: false

访问令牌可用于连接Azure Sql。

答案 1 :(得分:0)

尝试将您的连接字符串更改为;

"Data Source=<SQLServerName>.database.windows.net,1433;Initial Catalog=<dbName>;"

您正在使用的访问令牌应该正确,因为它是从“ https://database.windows.net/”生成的。

答案 2 :(得分:0)

line2(x=date , y= pos)对我没有没有起作用。然后,我完全将代码更改为此可以正常工作。..这里是一个示例(还注销了以前的所有登录信息,因为有时$ authResult处于错误状态并且其中没有访问令牌)。您可以根据自己的需要进行调整。

num(1006)

我还建议将Sql服务器AAD管理员设置为AAD组,并将servcie主体作为该组的成员。这样更容易管理。