Использование токена аутентификации в azure sdk fluent

Для аутентификации в Azure в Azure sdk fluent nuget существует метод, который использует идентификатор и секрет клиента, как показано ниже.

var azureCredentials = new AzureCredentials(new 
ServicePrincipalLoginInformation
        {
            ClientId = "ClientId",
            ClientSecret = "ClientSecret"
        }, "tenantId", AzureEnvironment.AzureGlobalCloud);

Есть ли какой-либо интерфейс, в котором токен аутентификации (JWT) можно использовать вместо использования идентификатора и секрета клиента при создании IAzure в приведенном ниже коде?

_azure = Azure
            .Configure()
            .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic)
            .Authenticate(azureCredentials)
            .WithSubscription(_subscriptionId); 

Примечание: у меня есть отдельный модуль аутентификации, который хранит идентификатор клиента и секрет при себе и использует их для получения токена аутентификации, который будет использоваться другими компонентами / SDK.


person Saravanan    schedule 24.05.2017    source источник


Ответы (3)


Ответ на самом деле да, вы можете использовать токен аутентификации (JWT). Это просто не так очевидно.

var context = new AuthenticationContext("https://login.microsoftonline.com/" + tenantId, false);
var result = context.AcquireToken("https://management.core.windows.net/", clientId, new Uri("http://localhost"), PromptBehavior.Always);
var token = result.AccessToken;
var client = RestClient
    .Configure()
    .WithEnvironment(AzureEnvironment.AzureGlobalCloud)
    .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic)
    .WithCredentials(new TokenCredentials(token))
    .Build();
var azure = Azure
    .Authenticate(client, tenantId)
    .WithSubscription(subscriptionId);

Вздох ... они изменили WithCredentials, чтобы использовать AzureCredentials вместо ServiceClientCredentials. Вот обновленная версия: -

var context = new AuthenticationContext("https://login.microsoftonline.com/" + tenantId, false);
var result = context.AcquireToken("https://management.core.windows.net/", clientId, new Uri("http://localhost"), PromptBehavior.Always);
var token = result.AccessToken;
var tokenCredentials = new TokenCredentials(token);
var azureCredentials = new AzureCredentials(
    tokenCredentials,
    tokenCredentials,
    tenantId,
    AzureEnvironment.AzureGlobalCloud);
var client = RestClient
    .Configure()
    .WithEnvironment(AzureEnvironment.AzureGlobalCloud)
    .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic)
    .WithCredentials(azureCredentials)
    .Build();
var azure = Azure
    .Authenticate(client, tenantId)
    .WithSubscription(subscriptionId);
person jonny    schedule 17.07.2017
comment
Это не компилируется по состоянию на 21.04.2018; ( - person Stephane; 21.04.2018
comment
Это не работает, см. Ответ hovsepm ниже. - person anirudhgarg; 25.10.2018

Начиная с Azure Management Fluent SDK v1.10, вы можете использовать любой поставщик учетных данных, производный от ServiceClientCredentials. Другими словами, вы должны иметь возможность передать уже полученную строку токена Bearer в конструктор AzureCredentials следующим образом

var customTokenProvider = new AzureCredentials(
                        new TokenCredentials(armAuthToken),
                        new TokenCredentials(graphAuthToken),
                        tenantId,
                        AzureEnvironment.AzureGlobalCloud);

var client = RestClient
                    .Configure()
                    .WithEnvironment(AzureEnvironment.AzureGlobalCloud)
                    .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic)
                    .WithCredentials(customTokenProvider)
                    .Build();

var authenticatedClient = Azure.Authenticate(client, tenantId);
person hovsepm    schedule 10.05.2018
comment
Можете ли вы описать, откуда вы берете armAuthToken и graphAuthToken? Другие примеры, похоже, подразумевают, что вы можете использовать токен Bearer для обоих этих входов, но мне не повезло с этим. Я не уверен, как базовый HttpClient для библиотеки узнает, что это токены Bearer в этом примере. - person Cory Gehr; 12.09.2019

Есть ли какой-либо интерфейс, в котором токен аутентификации (JWT) можно использовать вместо использования идентификатора и секрета клиента при создании IAzure в приведенном ниже коде?

Короче нет. Исходя из моего опыта, если мы хотим получить доступ к соответствующим ресурсам Azure, нам нужно получить токен аутентификации (JWT) из соответствующих ресурсов. В Azure есть множество ресурсов, таких как AzureSQL, KeyVault, ResourceManagement и т. Д.

По моему мнению, это не make senses, использующие токен аутентификации (JWT), который может получить доступ ко всем ресурсам Azure.

В настоящее время мы можем получить AzureCredentials из файла, ServicePrincipalLoginInformation, UserLoginInformation

Если мы хотим управлять определенным ресурсом, мы могли бы использовать для этого токен аутентификации (JWT), например, KeyVault.

    public static async Task<string> GetAccessToken(string azureTenantId,string azureAppId,string azureSecretKey)
    {

        var context = new AuthenticationContext("https://login.windows.net/" + azureTenantId);
        ClientCredential clientCredential = new ClientCredential(azureAppId, azureSecretKey);
        var tokenResponse =await context.AcquireTokenAsync("https://vault.azure.net", clientCredential); //KeyVault resource : https://vault.azure.net
        var accessToken = tokenResponse.AccessToken;
        return accessToken;
    }

    var kv = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(GetAccessToken));
person Tom Sun - MSFT    schedule 24.05.2017
comment
Мы используем принципала службы и сертификат (без использования секрета), чтобы получить токен доступа, который используется в insightsclient, телеметрии и т. Д. С этим новым свободным SDK я хотел бы использовать этот токен, не прибегая к идентификатору и секрету клиента. Есть ли какие-либо планы на будущее по открытию интерфейса на основе токенов? - person Saravanan; 24.05.2017
comment
Is there any future plan to expose token based interface? По моему мнению, я не использую токен аутентификации (JWT), который может получить доступ ко всем ресурсам Azure. Если у вас есть идеи, вы также можете предоставить отзыв команде Azure, если у вас есть какие-либо идеи. . - person Tom Sun - MSFT; 25.05.2017