我正在尝试使用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)
有什么想法吗?
答案 0 :(得分:0)
根据this doc:
此身份验证方法允许中间层服务获取JSON Web令牌(JWT)
您需要使用id_token来进行Azure AD身份验证。从您的脚本看来,您似乎正在使用管道环境访问令牌。
另一方面,您可以导航到 Azure Portal-> Azure Sql->查询编辑器页面。
然后,您可以选择Active Directory authentication
并检查是否可以成功登录数据库。
如果您在此页面中遇到问题Login failed for user '<token-identified principal>
,
您可以尝试在SQL Server或create contained users mapped to Azure AD identities上将目标帐户添加为Active Directory 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令牌连接Azure Sql,它可以按预期工作。
更新2:
获取它。如果将服务主体设置为AD Admin。 手动服务主体类型服务连接可以正常工作。
例如:
- 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主体作为该组的成员。这样更容易管理。