2

最近创建了一个正在运行的函数应用程序。函数应用托管 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. 从提供者处检索 Auth 令牌
  2. 使用令牌连接到 Azure SQL 服务器

但是,当使用 PowerShell 函数时,第一步有效,但在第二步尝试建立连接时,出现以下错误:

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

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

4

3 回答 3

2

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

https://database.windows.net

它应该是

https://database.windows.net/

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

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

于 2018-12-04T22:04:27.610 回答
1

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

Azure Active Directory 的托管服务标识 (MSI) 的常见问题和已知问题

MSI 是否与 Active Directory 身份验证库 (ADAL) 或 Microsoft 身份验证库 (MSAL) 一起使用?

不,MSI 尚未与 ADAL 或 MSAL 集成。有关使用 MSI REST 端点获取 MSI 令牌的详细信息,请参阅如何使用 Azure VM 托管服务标识 (MSI) 获取令牌

Web 应用程序用户语音反馈

于 2018-04-19T02:09:10.223 回答
0

如果我们想使用 AAD 令牌访问 Azure SQL,我们需要为您的 Azure SQL 数据库服务器预配一个 Azure Active Directory 管理员。并创建一个包含的数据库用户,表示使用 Azure AD 令牌连接的应用程序

CREATE USER [appName] FROM EXTERNAL PROVIDER;

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

您也可以向 Azure 团队提供反馈。

以下是我的测试步骤。

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

在此处输入图像描述

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

在此处输入图像描述

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

正在创建 [tomtestmsi]... (62,1):SQL72014:.Net SqlClient 数据提供者:消息 33130,级别 16,状态 1,行 1 找不到主体“xxxx”或不支持此主体类型。(62,0): SQL72045: 脚本执行错误。执行的脚本:CREATE USER [xxxx] FOR EXTERNAL PROVIDER;执行批处理时发生错误。

在此处输入图像描述

于 2018-04-12T08:41:00.727 回答