![](/img/trans.png)
[英]Connect to SQL Server db with Azure AD MFA using Python in Docker
[英]Connecting to SQL Server using Powershell with Azure AD MFA
我正在嘗試使用來自 Azure AD 的訪問令牌連接到我的 Azure SQL 實例。 我在這里關注本教程: https://medium.com/microsoftazure/deploying-a-dacpac-to-azure-with-azure-pipelines-and-managed-identity-89703d405e00
但是這種方法有些問題。
第一件事是確保我的用戶通過以下方式在數據庫中設置:
CREATE USER [myemail@email.com] FROM EXTERNAL PROVIDER WITH DEFAULT_SCHEMA=[dbo]
這個答案的過程是一樣的: https://stackoverflow.com/a/62161471/1963929
然后我測試了 SQL Server Management Studio 和 Azure Data Studio,兩者都運行良好。
但是,當我在 Powershell 中嘗試完全相同的事情時,它不起作用,我得到的只是Login failed for user '<token-identified principal>'.
這是我嘗試過的
$conn = New-Object System.Data.SqlClient.SQLConnection
$conn.ConnectionString = "Server=tcp:azure-sql.database.windows.net,1433;Initial Catalog=default;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30"
$conn.AccessToken = $(az account get-access-token --resource=https://database.windows.net/ --query accessToken)
$conn.Open()
連接到我的數據庫時收到的錯誤如下
MethodInvocationException:使用“0”參數調用“Open”的異常:“用戶''登錄失敗。”
然后我想“也許我使用了錯誤的設置”所以我嘗試使用我的應用程序用來連接到同一個數據庫的客戶端 ID。 這次我測試了多個范圍:none、 .default
和user_impersonation
。
$clientid = "azure-data-studio-client-id"
$request = Invoke-RestMethod -Method GET -Uri "https://login.microsoftonline.com/organizations/oauth2/v2.0/devicecode" -Body @{client_id=$clientid; scope="https://database.windows.net/user_impersonation"} -ContentType "application/x-www-form-urlencoded"
$request.message
$tokens = Invoke-RestMethod -Method POST -Uri "https://login.microsoftonline.com/organizations/oauth2/v2.0/token" -Body @{client_id=$clientid; grant_type="urn:ietf:params:oauth:grant-type:device_code"; code = $request.device_code} -ContentType "application/x-www-form-urlencoded"
$accesstoken = $tokens.access_token
所以我想也許 Azure Data Studio 有超能力,並且在那里使用了另一個帳戶而不做CREATE USER
,我得到了正確的錯誤
這個錯誤證明我需要CREATE USER
,但它並沒有解釋為什么我不能通過 Powershell 做到這一點。
我還嘗試了 Node 和 Tedious,如下所示:
const dbConfig = {
authentication: {
type: "azure-active-directory-access-token",
options: {
token: token
}
},
server: getDatabasePerEnvironment(environment),
database: databaseName,
options: {
trustServerCertificate: false,
encrypt: true,
port: 1433
}
};
const connection = new tedious.Connection(dbConfig);
同樣的錯誤:
“ConnectionError:用戶''登錄失敗。
有誰知道我做錯了什么?
我發現了問題,我的問題比我想象的要小。
我在這個答案中找到了我的答案: Azure SQL 使用 PowerShell 和 ServicePrincipal 為 AD 用戶授予訪問權限
發生了什么是這一行:
$conn.AccessToken = $(az account get-access-token --resource=https://database.windows.net/ --query accessToken)
返回用雙引號括起來的訪問令牌
$conn.AccessToken = $(az account get-access-token --subscription $subscription --resource https://database.windows.net --query accessToken -o tsv)
最后的-o tsv
將修剪 output 中的雙引號。
在 TediousJS 上,問題是我在做
const tokenPayload = JSON.parse(execSync("az account get-access-token").toString());
我需要做的是:
const tokenPayload = execSync(
"az account get-access-token --subscription YOUR-SUBSCRIPTION --resource https://database.windows.net --query accessToken -o tsv"
).toString();
因此,將 Azure CLI 令牌與 SQL 服務器一起使用所需的步驟如下:
CREATE USER [youremail@mail.com] FROM EXTERNAL PROVIDER WITH DEFAULT_SCHEMA=[dbo]
ALTER ROLE db_datareader ADD MEMBER [youremail@mail.com];
ALTER ROLE db_datawriter ADD MEMBER [youremail@mail.com];
ALTER ROLE db_ddladmin ADD MEMBER [youremail@mail.com];
$conn = New-Object System.Data.SqlClient.SQLConnection
$conn.ConnectionString = "Server=yourserver.database.windows.net;Initial Catalog=Subledger;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30"
$conn.AccessToken = $(az account get-access-token --subscription YOUR-SUBSCRIPTION --resource https://database.windows.net --query accessToken -o tsv)
$conn.Open()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.