ADOMDを使用してAzure Analysisサービスに接続しようとしていて、サービスプリンシパルを使用して認証しようとしています。だから次のようにした:サービスプリンシパルを使用したAzure分析サービス接続が機能しない
- アプリをAADで作成する。
- Azure Analysisサービスに対するアプリケーション(サービスプリンシパル)の読み取り許可を与えました。
以下は、Azure Analysisサービスに接続するためのコードです。
var clientId = "******";
var clientSecret = "*****";
var domain = "****.onmicrosoft.com";
var ssasUrl = "northeurope.asazure.windows.net";
var token = await TokenHelper.GetAppOnlyAccessToken(domain, $"https://{ssasUrl}", clientId, clientSecret);
var connectionString = $"Provider=MSOLAP;Data Source=asazure://{ssasUrl}/{modelname};Initial Catalog= adventureworks;User ID=;Password={token};Persist Security Info=True;Impersonation Level=Impersonate";
var ssasConnection = new AdomdConnection(connectionString);
ssasConnection.Open();
var query = @"Evaluate TOPN(10,Customer,Customer[Customer Id],1)";
var cmd = new AdomdCommand(query)
{
Connection = ssasConnection
};
using (var reader = cmd.ExecuteXmlReader())
{
string value = reader.ReadOuterXml();
Console.WriteLine(value);
}
私は、有効なアクセストークンを取得することができていますが、接続を開こうとしたときに、私は次のエラーを取得する:
AdomdErrorResponseException:ユーザー、いずれかの「アプリ:XXXXXXXする@ XXXXXX」がありません'adventureworks'データベースにアクセスするか、データベースが存在しません。
追加情報::私はパーミッション(貢献してリーダー&も試してみました)ことを確認した
- は、Azureのポータルを通してAzureの分析サービスにサービスプリンシパルに与えられています。
- 私はサービスアカウント(username &パスワード)で同じコードを試してみました。
- 接続文字列から "Initial Catalog = adventureworks"を削除すると、接続は成功します。しかし、Analysis Servicesのアクセス許可がモデルに伝播されない理由はわかりません。
解像度:
愚かな私はこれを掲示した後、自分で解決しました。上記3のポイントは私に手がかりを与えました。ポータルを通じてAzure分析サービスへの許可を与えても、サービス主体(Azuire ADアプリケーション)のモデルには反映されません。
ステップ:
- オープンSQLサーバMgmt(仮想ディスクの管理)StudioのAzureの分析サービス。
- 対象モデルでロールに移動します。
権限を必要とする役割にサービスプリンシパルを追加します。
アプリ:[APPID] @ [tenantid]
例:アプリ:8249E22B-CFF9-440C-AF27-60064A5743CE @ 86F119BE-D703-49E2-8B5F-サービス主体は、フォーマットの下に追加され72392615BB97
を、あなたのサービスプリンシパルがあなたのSQLにアクセスする権限を持っていないようです。それに 'データベースの役割 'を与えるべきです。他のAzureリソースにアクセスする必要がある場合は、 'Owner'または' Contributor'ロールが必要です。 –