web-dev-qa-db-ja.com

SQL ServerでAzure ADサービスプリンシパルを使用して接続できない

Active DirectoryサービスプリンシパルでSSMSを使用してAzure SQL Serverへの接続をテストする際に問題が発生しました。

AD管理者アカウントを作成し、SSMS経由で接続できる同僚のADユーザーアカウントを追加しました。

サービスプリンシパルは、キーを持つWebアプリ/ Apiサービスプリンシパルです。そして、私はデータベースを含むユーザーを作成しようとしています(これは互換性のあるより良い未来を持っていることを理解しています)

ユーザーを作成するための構文であると考えて、多くのバリエーションを試しましたが、この構文のみが機能しました。

CREATE USER [username] FROM EXTERNAL PROVIDER

(他のバリエーションでは、サービスの原則が見つからないか、タイプがサポートされていません)。

SSMSでデータベース名を指定しています。

「Active Directory-MFAをサポートするユニバーサル」と「Active Directory-パスワード」を試しました。

受け取ったエラーは、「ユーザーレルムを検出できませんでした」で、使用するActive Directoryテナントを認識していないことを示していますが、これらのユーザーログイン形式はどれも機能していないようです(パスワードバージョンを使用すると、普遍的には期待できません) ):

  • ユーザー
  • ドメイン\ユーザー
  • [email protected](FQDN)
  • user_domain.com#EXT#@domain.onmicrosoft.com
  • オブジェクトID
  • アプリケーションID

ただし、MSDNのドキュメントでは、ADサービスプリンシパルのサポートが推奨されています。

他のことには問題なくAzure Active Directoryサービスプリンシパルを使用しています。

何か案は?

編集


Azure AD認証を使用してAzure SQLデータベースに接続した後、プロットが厚くなります

サービスプリンシパルがADで明示的なアクセス許可を必要とするかどうか疑問に思いましたが、偽装を行わないようにコードを少し変更して、c#を使用して問題なく接続できました(stackexchange構文の強調表示用にc#タグを追加しました)。

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(両方のguids)の形式でユーザー名を返します。ただし、この形式はSSMSでは機能しません。

編集2


興味深いことに、C#コードで接続文字列のユーザー名/パスワードに切り替えると、同じユーザー領域エラーが発生します。

3
Alex KeySmith

サービスプリンシパルは、SSMSおよび他のSQLツールではサポートされていません。このタイプのAADサービスでは、アプリケーションインターフェイスのみがサポートされています。C#プログラムが機能し、これがテストを続行する正しい方法です。

1
MirekS