在启用MSI的功能应用程序中无法使用PowerShell连接到Azure SQL

时间:2018-04-11 23:12:22

标签: powershell azure-sql-database azure-functions azure-sqldw azure-msi

最近创建了一个运行的功能app。该功能应用程序托管一个C#和PowerShell函数,该函数在启用MSI的情况下按预期工作

以下PowerShell代码,Github

中的完整代码

Write-Output "PowerShell Timer trigger function executed at:$(get-date)";

# Get MSI AUTH
$endpoint = $env:MSI_ENDPOINT
$secret = $env:MSI_SECRET
$sqlTokenURI = "https://database.windows.net&api-version=2017-09-01"
$header = @{'Secret' = $secret}
$authenticationResult = Invoke-RestMethod -Method Get -Headers $header -Uri ($endpoint +'?resource=' +$sqlTokenURI)

# CONNECT TO SQL
$SqlServer = $env:SQL_SERVER_NAME
$SqlServerPort = 1433
$Database = "azuredwmonitordb"
$Conn = New-Object System.Data.SqlClient.SqlConnection("Data Source=tcp:$($SqlServer),1433; Initial Catalog=$($Database);")
$Conn.AccessToken = $authenticationResult.access_token

# Open the SQL connection 
$Conn.Open() 

$Cmd=new-object system.Data.SqlClient.SqlCommand("SELECT @@SERVERNAME", $Conn) 
$Cmd.CommandTimeout=120 

# Execute the SQL command 
$Ds=New-Object system.Data.DataSet 
$Da=New-Object system.Data.SqlClient.SqlDataAdapter($Cmd) 
[void]$Da.fill($Ds) 

# Output the count 
$Ds.Tables.Column1 

# Close the SQL connection 
$Conn.Close()

两个函数都实现相同的逻辑:

  1. 从提供商
  2. 中检索身份验证令牌
  3. 使用令牌
  4. 连接到Azure SQL服务器

    但是,在使用PowerShell功能时,第一步是步骤,但在尝试在第二步中建立连接时,我收到以下错误:

      

    执行函数时出现异常:Functions.dm_pdw_exec_sessions。 Microsoft.Azure.WebJobs.Script:PowerShell脚本错误。 System.Management.Automation:使用“0”参数调用“打开”的异常:“用户登录失败'NT AUTHORITY \ ANONYMOUS LOGON'。”。 .Net SqlClient数据提供程序:用户'NT AUTHORITY \ ANONYMOUS LOGON <登录失败

    我在过去看到过这样的情况,即Azure SQL服务器没有正确启用AAD身份验证(用户不在主服务器中),但这不是这种情况。

3 个答案:

答案 0 :(得分:1)

目前不支持此身份验证方案。

FAQs and known issues with Managed Service Identity (MSI) for Azure Active Directory

MSI是否可以使用Active Directory身份验证库(ADAL)或Microsoft身份验证库(MSAL)?

不,MSI尚未与ADAL或MSAL集成。有关使用MSI REST端点获取MSI令牌的详细信息,请参阅How to use an Azure VM Managed Service Identity (MSI) for token acquisition

Web Apps User Voice feedback

答案 1 :(得分:1)

问题出在资源URI中-缺少正斜杠。代替:

https://database.windows.net

应该是

https://database.windows.net/

因此将您的$ sqlTokenURI更改为此,它应该可以工作:

$ sqlTokenURI =“ https://database.windows.net/&api-version=2017-09-01

答案 2 :(得分:0)

如果我们想使用AAD令牌访问Azure SQL,我们需要Provision an Azure Active Directory administrator for your Azure SQL Database server。并且create a contained database user representing an application that connects using an Azure AD token

CREATE USER [appName] FROM EXTERNAL PROVIDER;

我的Azure帐户不是全局管理员,我发现我无法创建该用户。如果您是全球管理员帐户,可以尝试一下。我将从microsoft azure团队那里得到一些帮助,如果有任何回复,我会在这里更新。

您也可以将您的feedback提供给Azure团队。

以下是我的测试步骤。

1.启用Azure功能后,我们发现它创建了AD应用程序,但它不在我的注册应用程序下,更多细节请参考屏幕截图。

enter image description here

2.为Azure SQL数据库服务器提供Azure Active Directory管理员

enter image description here

3.连接到Azure Sql并创建表示应用程序的包含数据库用户

  

创建[tomtestmsi] ...   (62,1):SQL72014:.Net SqlClient数据提供者:消息33130,级别16,状态1,行1主体&#39; xxxx&#39;无法找到或不支持此主要类型。   (62,0):SQL72045:脚本执行错误。执行的脚本:   为外部提供者创建用户[xxxx];   批处理执行时发生错误。

enter image description here