最近创建了一个运行的功能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()
两个函数都实现相同的逻辑:
但是,在使用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身份验证(用户不在主服务器中),但这不是这种情况。
答案 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。
答案 1 :(得分:1)
问题出在资源URI中-缺少正斜杠。代替:
应该是
因此将您的$ 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应用程序,但它不在我的注册应用程序下,更多细节请参考屏幕截图。
2.为Azure SQL数据库服务器提供Azure Active Directory管理员
3.连接到Azure Sql并创建表示应用程序的包含数据库用户
创建[tomtestmsi] ... (62,1):SQL72014:.Net SqlClient数据提供者:消息33130,级别16,状态1,行1主体&#39; xxxx&#39;无法找到或不支持此主要类型。 (62,0):SQL72045:脚本执行错误。执行的脚本: 为外部提供者创建用户[xxxx]; 批处理执行时发生错误。