簡體   English   中英

使用 Powershell 和 Azure AD MFA 連接到 SQL 服務器

[英]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、 .defaultuser_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 服務器一起使用所需的步驟如下:

  1. 在 Azure SQL 上配置 Active Directory 管理員
  2. 執行如下操作以添加您的用戶
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];
  1. 確認您可以使用 SSMS 或 Azure 數據工作室連接 Azure AD
  2. 嘗試以下操作:
$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM