Как создать токен SAS для Azure Data Lake Store (Gen-2) с помощью субъектов-служб (clientId и clientSecret) на C #?

У меня есть clientId и clientSecret Data Lake Store (Gen-2), и я ищу способ создать для него токен SAS программным способом с использованием C #. Я просмотрел документацию, но не нашел способа создать токен SAS. Любое руководство будет оценено по достоинству. Спасибо.

Как было предложено Фаридом Уддином Кироном, я использовал этот код, но безуспешно:

//Token Request End Point
string tokenUrl = $"https://login.microsoftonline.com/<tenantId>.onmicrosoft.com/oauth2/token";
var tokenRequest = new HttpRequestMessage(HttpMethod.Post, tokenUrl);

//I am Using client_credentials as It is mostly recommended
tokenRequest.Content = new FormUrlEncodedContent(new Dictionary<string, string>
            {
                ["grant_type"] = "client_credentials",
                ["client_id"] = "--------",
                ["client_secret"] = "-------",
                ["resource"] = "https://<datalake gen2 name>.dfs.core.windows.net/"
            });

            dynamic json;
AccessTokenClass results = new AccessTokenClass();
HttpClient client = new HttpClient();

var tokenResponse = client.SendAsync(tokenRequest).GetAwaiter();

json = tokenResponse.GetResult().Content.ReadAsStringAsync().GetAwaiter();
results = JsonConvert.DeserializeObject<AccessTokenClass>(json);

Это дает мне ошибку статуса 400.


person Bilal Shafqat    schedule 19.03.2020    source источник
comment
Ознакомьтесь с этим ответом follow the token part. Надеюсь, это поможет. Дайте мне знать, если вас все еще беспокоит.   -  person Md Farid Uddin Kiron    schedule 19.03.2020
comment
@MdFaridUddinKiron, спасибо за ответ, но он не работает.   -  person Bilal Shafqat    schedule 19.03.2020
comment
Не могли бы вы поделиться своей проблемой или фрагментом кода, чтобы его можно было воспроизвести.   -  person Md Farid Uddin Kiron    schedule 19.03.2020
comment
@MdFaridUddinKiron, я обновил вопрос и добавил код, это дает мне ошибку статуса 400.   -  person Bilal Shafqat    schedule 19.03.2020
comment
Кажется, ваш resource неверен. Должно быть https://datalake.azure.net/   -  person Md Farid Uddin Kiron    schedule 19.03.2020
comment
@MdFaridUddinKiron, позвольте мне попробовать с этим, но я не думаю, что это должно быть общим, так как я должен упомянуть, к какой datalake я хочу подключиться правильно?   -  person Bilal Shafqat    schedule 19.03.2020
comment
Ваш clientId и secret будут определять, где необходимо подключиться. Я получил токен, используя это. Дайте мне знать как можно скорее.   -  person Md Farid Uddin Kiron    schedule 19.03.2020
comment
все еще есть код состояния 400, один clientId и секрет могут быть назначены нескольким ресурсам.   -  person Bilal Shafqat    schedule 19.03.2020
comment
Ресурс должен выглядеть как resource:https://datalake.azure.net/, я думаю, вы делаете что-то дополнительное. См. здесь   -  person Md Farid Uddin Kiron    schedule 19.03.2020
comment
Кроме того, вы ссылаетесь на этот официальный документ   -  person Md Farid Uddin Kiron    schedule 19.03.2020
comment
@BilalShafqat Вы хотите использовать токен доступа Azure AD для доступа к озеру данных 2-го поколения?   -  person Jim Xu    schedule 25.03.2020
comment
@JimXu Спасибо за ответ. Что ж, позвольте мне все объяснить. У меня есть принципалы службы: ClientId, ClientSecrets. И эти участники служб имеют доступ к ресурсу Data Lake Store Gen-2. Теперь я хочу каким-то образом программно (C #) использовать этих субъектов-служб и сгенерировать токен SAS, который я могу использовать в дальнейшем. Мне нужен токен SAS, потому что Snowflake Warehouse позволяет создавать этапы с использованием токена SAS. Мне нужен этот токен SAS, пожалуйста, помогите мне.   -  person Bilal Shafqat    schedule 25.03.2020
comment
@BilalShafqat Что вы имеете в виду SAS token? Маркер доступа Azure AD или маркер SAS хранилища Azure?   -  person Jim Xu    schedule 25.03.2020
comment
@ JimXu, под этим я подразумеваю токен SAS службы хранилища Azure.   -  person Bilal Shafqat    schedule 26.03.2020
comment
@BilalShafqat, пожалуйста, проверьте мое обновление.   -  person Jim Xu    schedule 27.03.2020
comment
@JimXu, спасибо за помощь, но я хочу сгенерировать SAS озера данных Gen-2, используя принципалов служб, а не по ключу. В вашем последнем коде вы используете ключ учетной записи для генерации SAS.   -  person Bilal Shafqat    schedule 27.03.2020
comment
Пока нет возможности создать SAS на уровне контейнера ADLS Gen2. Мы можем создавать управляемые политики, но я не знаю, что от этого нужно.   -  person Hemant Chandurkar    schedule 28.08.2020


Ответы (2)


Если вы хотите использовать токен доступа Azure AD для доступа к озеру данных Azure 2-го поколения, см. Следующий код.

  1. создать субъект-службу и назначить роль Azure RABC для sp.
az login
az account set --subscription "<your subscription id>"
# it will assign Storage Blob Data Contributor to the sp at subscription level
az ad sp create-for-rbac -n "mysample" --role Storage Blob Data Contributor

введите здесь описание изображения

  1. Код
string tokenUrl = $"https://login.microsoftonline.com/<tenantId>.onmicrosoft.com/oauth2/token";
var tokenRequest = new HttpRequestMessage(HttpMethod.Post, tokenUrl);

//I am Using client_credentials as It is mostly recommended
tokenRequest.Content = new FormUrlEncodedContent(new Dictionary<string, string>
            {
                ["grant_type"] = "client_credentials",
                ["client_id"] = "--------",
                ["client_secret"] = "-------",
                ["resource"] = "https://storage.azure.com/"
            });

            dynamic json;
AccessTokenClass results = new AccessTokenClass();
HttpClient client = new HttpClient();

var tokenResponse = client.SendAsync(tokenRequest).GetAwaiter();

json = tokenResponse.GetResult().Content.ReadAsStringAsync().GetAwaiter();
results = JsonConvert.DeserializeObject<AccessTokenClass>(json);

Если вы хотите создать токен sas, выполните следующие действия.

  1. получите ключ учетной записи через портал Azure  введите описание изображения здесь

  2. код

var key = account key you copy";
            var accountName = "testadls05";
            StorageSharedKeyCredential credential = new StorageSharedKeyCredential(accountName, key);
            AccountSasBuilder sas = new AccountSasBuilder
            {
                Protocol = SasProtocol.None,
                Services = AccountSasServices.Blobs,
                ResourceTypes = AccountSasResourceTypes.All,
                StartsOn = DateTimeOffset.UtcNow.AddHours(-1),
                ExpiresOn = DateTimeOffset.UtcNow.AddHours(1),

            };
            sas.SetPermissions(AccountSasPermissions.All);

            var uri = $"https://{accountName}.dfs.core.windows.net/";

            UriBuilder sasUri = new UriBuilder(uri);
            sasUri.Query = sas.ToSasQueryParameters(credential).ToString();

            DataLakeServiceClient service = new DataLakeServiceClient(sasUri.Uri);
            var result =service.GetFileSystems().First();
            Console.WriteLine(result.Name);

введите здесь описание изображения

person Jim Xu    schedule 26.03.2020
comment
спасибо за помощь, но я хочу сгенерировать SAS озера данных 2-го поколения с использованием принципалов служб, а не ключа. В вашем последнем коде вы используете ключ учетной записи для генерации SAS. - person Bilal Shafqat; 27.03.2020
comment
@BilalShafqat У нас нет возможности использовать принципалов служб для создания токена sas: docs.microsoft.com/en-us/rest/api/storageservices/ - person Jim Xu; 27.03.2020
comment
@BilalShafqatb У вас есть другие проблемы? - person Jim Xu; 31.03.2020

Следующий код можно использовать для создания токена SAS для datalake gen2 с использованием принципов обслуживания:

Здесь используется пароль Client Secret, а имя пользователя - ClientId.

$securePassword = ConvertTo-SecureString -AsPlainText -Force -String $Password
$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $UserName, $securePassword
Connect-AzAccount -Credential $Credential -ServicePrincipal -Tenant $Tenant -Subscription $SubscriptionName

Write-Host -ForegroundColor Green "Creating an account level SAS Token.."
## Get the storage account
$storageAcc=Get-AzStorageAccount -ResourceGroupName $resourceGroupName -Name $storageAccName
## Get the storage account context
$ctx=$storageAcc.Context
## Creates an account-level SAS token.
New-AzStorageAccountSASToken -Context $ctx -Service Blob,File,Table,Queue -ResourceType Service,Container,Object -Permission "racwdlup" -StartTime "2020-06-18" -ExpiryTime "2022-06-18"
person Bilal Shafqat    schedule 30.08.2020