Может ли AdomdConnection принять токен - PullRequest
0 голосов
/ 30 октября 2019

У меня есть следующий код для получения доступа к SQL с использованием C #, есть ли эквивалент для служб анализа? Я пробовал разные подходы, но не вижу, где можно предоставить токен доступа?

Создать соединение SQL

return new SqlConnection($"Data Source=abc; Initial Catalog=def")
{
    AccessToken = GetToken()
};

Подключение служб Analysis Services

var builder = new OleDbConnectionStringBuilder
{
    ConnectionString = "abc"
};

builder.Add("Password", "5r6utviub");

return new AdomdConnection(builder.ConnectionString);

Метод GetToken ниже

        var request = (HttpWebRequest)WebRequest.Create("xxx");
        request.Headers["Metadata"] = "true";
        request.Method = "GET";
        string accessToken;
        try
        {
            var response = (HttpWebResponse)request.GetResponse();
            var streamResponse = new StreamReader(response.GetResponseStream());
            string stringResponse = streamResponse.ReadToEnd();
            JavaScriptSerializer j = new JavaScriptSerializer();
            var list = (Dictionary<string, string>)j.Deserialize(stringResponse, typeof(Dictionary<string, string>));
            accessToken = list["access_token"];
        }
        catch (Exception e)
        {
            throw new Exception(e.Message);
        }
        return accessToken;

Обновление

var builder = new OleDbConnectionStringBuilder
{
    ConnectionString = $"Provider=MSOLAP;Data Source=asazure://somewhere.asazure.windows.net/xyz;Catalog=mydb;Password={GetToken()};Persist Security Info=True;Impersonation Level=Impersonate"
};
return new AdomdConnection(builder.ConnectionString);

conn.Open();  // fails with Authentication failed

Обновление № 2 - показывает строку подключения

Provider=MSOLAP;
Data Source=asazure://somewhere.asazure.windows.net/xyz;
Persist Security Info=True;
Password=qwertyuytrxtcfyvgubhkvjchxye56udb4sxcbhvutycxt;
Impersonation Level=Impersonate;
catalog=db

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

Да Полное решение это:

        private static string GetAccessToken()
    {
        string clientId = "xxx";
        string aadTenantId = "xxx";
        string clientSecretKey = "xxx";

        string AadInstance = "https://login.windows.net/{0}";
        string ResourceId = "https://northeurope.asazure.windows.net/"; //Be careful it must be your resource location. please find it on your azure service. Otherwise you can take token but you cannot login your service.

        AuthenticationContext authenticationContext = new AuthenticationContext(string.Format(AadInstance, aadTenantId));
        ClientCredential clientCredential = new ClientCredential(clientId, clientSecretKey);

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

        return authenticationResult.AccessToken;
    }

И использовать его:

        static void Main(string[] args)
    {            
        var accessToken = GetAccessToken();

        var server = "asazure://northeurope.asazure.windows.net/yourInstanceName";
        var databaseName = "MY DB NAME";

        string ConnectionString = $"Provider=MSOLAP;Data Source={server};User ID=;Password={accessToken};Catalog={databaseName};Persist Security Info=True; Impersonation Level=Impersonate";

        using (AdomdConnection adomdConnection = new AdomdConnection())
        {
            adomdConnection.ConnectionString = ConnectionString;
            AdomdCommand adomdCommand = new AdomdCommand();
            adomdCommand.Connection = adomdConnection;                
            adomdCommand.CommandText = "SAMPLE QUERY";
            adomdConnection.Open();
            CellSet cellSet = adomdCommand.ExecuteCellSet();
            adomdConnection.Close();
        }

    }
0 голосов
/ 30 октября 2019

Чтобы использовать токен-носитель с AdomdConnection, отформатируйте строку подключения следующим образом:

 var server = ...;
 var token = ...;
 var constr = $"Data Source={server};Password={token};Catalog={database};Persist Security Info=True; Impersonation Level=Impersonate";

И AdomdConnection отличается от OleDbConnection. ADOMD.NET - это нативная библиотека .NET для AS / AAS, и это то, что вы должны использовать.

...