Azure-Sql-Database

無法使用 SQL Server 上的 Azure AD 服務主體進行連接

  • August 31, 2017

我在使用帶有 Active Directory 服務主體的 SSMS 測試與 Azure SQL Server 的連接時遇到問題。

我創建了一個 AD Admin 帳戶,並已成功添加同事的 AD 使用者帳戶,該帳戶可以通過 SSMS 連接。

服務主體是具有密鑰的 Web 應用程序/API 服務主體。我正在嘗試創建一個包含數據庫的使用者(理解這有更好的未來兼容)

認為這可能是創建使用者的語法,我嘗試了很多變體,但是只有這種語法有效:

CREATE USER [username] FROM EXTERNAL PROVIDER

(其他變體表示找不到服務原則或不支持類型)。

我在 SSMS 中指定了數據庫名稱。

我試過“Active Directory - 支持 MFA 的通用”和“Active Directory - 密碼”。

我收到的錯誤是“無法發現使用者領域”,這表明它不知道要使用的活動目錄租戶,但是這些使用者登錄格式似乎都不起作用(使用密碼版本,我不希望它們通用):

但是 MSDN 文件建議支持 AD 服務主體。

我正在使用 azure Active Directory 服務主體來處理其他事情。

有任何想法嗎?

編輯


閱讀通過使用 Azure AD 身份驗證連接到 Azure SQL 數據庫後,情節變厚了

我想知道服務主體是否需要 AD 中的顯式權限,但是稍微修改程式碼使其不進行模擬,我能夠使用 c# 正常連接(我添加了 c# 標記以突出顯示 stackexchange 語法)

var sqlConnectionString = "Data Source=tcp:[servername].database.windows.net,1433;Initial Catalog=[databasename];Persist Security Info=False;Connect Timeout=30;Encrypt=True;TrustServerCertificate=False";

string clientId = "[service principal application id]";
string aadTenantId ="[azure active directory id]";


string AadInstance = "https://login.windows.net/{0}";
string ResourceId = "https://database.windows.net/";


var authenticationContext = new AuthenticationContext(string.Format(AadInstance, aadTenantId));
var clientCredential = new ClientCredential(clientId, LINQPad.Util.GetPassword("[the password to get]"));

var authenticationResult = authenticationContext.AcquireTokenAsync(ResourceId, clientCredential).Result;

authenticationResult.Dump();

using (var conn = new SqlConnection(sqlConnectionString))
{
   conn.AccessToken = authenticationResult.AccessToken;
   conn.Open();

   using (var cmd = new SqlCommand("SELECT SUSER_SNAME()", conn))
   {
       var result = cmd.ExecuteScalar();
       result.Dump();
   }
}

值得注意的是,SUSER_SNAME() 以 clientid@tenantid 格式(兩個 guid)返回使用者名。但是這種格式在 SSMS 中不起作用。

編輯 2


有趣的是,如果在 C# 程式碼中切換到連接字元串中的使用者名/密碼,我會收到相同的使用者領域錯誤。

SSMS 以及其他 SQL 工具不支持服務主體。此類 AAD 服務僅支持應用程序介面。您的 C# 程序可以正常工作,這是進行測試的正確方法。

引用自:https://dba.stackexchange.com/questions/184598