無法使用 SQL Server 上的 Azure AD 服務主體進行連接
我在使用帶有 Active Directory 服務主體的 SSMS 測試與 Azure SQL Server 的連接時遇到問題。
我創建了一個 AD Admin 帳戶,並已成功添加同事的 AD 使用者帳戶,該帳戶可以通過 SSMS 連接。
服務主體是具有密鑰的 Web 應用程序/API 服務主體。我正在嘗試創建一個包含數據庫的使用者(理解這有更好的未來兼容)
認為這可能是創建使用者的語法,我嘗試了很多變體,但是只有這種語法有效:
CREATE USER [username] FROM EXTERNAL PROVIDER
(其他變體表示找不到服務原則或不支持類型)。
我在 SSMS 中指定了數據庫名稱。
我試過“Active Directory - 支持 MFA 的通用”和“Active Directory - 密碼”。
我收到的錯誤是“無法發現使用者領域”,這表明它不知道要使用的活動目錄租戶,但是這些使用者登錄格式似乎都不起作用(使用密碼版本,我不希望它們通用):
- 使用者
- 域\使用者
- user@domain.com (FQDN)
- user_domain.com#EXT#@domain.onmicrosoft.com
- 對象編號
- 應用程序編號
但是 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# 程序可以正常工作,這是進行測試的正確方法。