Как использовать аутентификацию MSI вместо предоставления идентификатора клиента и ключа клиента для получения токена доступа для пакетной службы и управления?

Я создаю функцию C # Azure и получаю токен доступа с использованием идентификатора клиента, ключа клиента и идентификатора клиента для работы в пакетной службе и управлении. Могу ли я использовать аутентификацию MSI для получения токена доступа.

Я использую следующие API:

  • Подписка на рассылку - GET https://management.azure.com/subscriptions?api-version=2019-06-01 (документы)
  • Список учетных записей пакетной службы по идентификатору подписки: GET https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.Batch/batchAccounts?api-version=2019-08-01 (docs )
  • Список пулов на основе пакетной учетной записи: GET {batchUrl}/pools?api-version=2019-08-01.10.0 (docs )
  • Список заданий на основе пакетной учетной записи: GET {batchUrl}/jobs?api-version=2019-08-01.10.0 (docs )
  • Удалить пул на основе идентификатора пула: DELETE {batchUrl}/pools/{poolId}?api-version=2019-08-01.10.0 (docs )
  • Удалить задание на основе идентификатора задания: DELETE {batchUrl}/jobs/{jobId}?api-version=2019-08-01.10.0 (docs )

Они работают нормально, но из соображений безопасности в организации я не могу использовать идентификатор клиента и ключ клиента. И даже хранить их в хранилище ключей сейчас тоже нельзя. Есть ли способ использовать MSI? - Код будет работать на бессерверной платформе, то есть в функциях Azure.


person Gour Gopal    schedule 06.12.2019    source источник


Ответы (1)


Да, вы можете добиться этого, выполнив следующие шаги:

  • Настройка веб-API. Размещенный в Azure веб-API настроен на использование Аутентификация Azure AD на основе токена JWT. Предположим, я создал приложение AD и ClientId настроил, как показано ниже. Для любого запроса к веб-API требуется действительный токен из приложения Azure AD в заголовке запроса. Вот пример кода для настройки веб-API:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc(options =>
        {
            var policy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();
            options.Filters.Add(new AuthorizeFilter(policy));
        }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    
        services
            .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options => 
            {
                options.Audience = Configuration["AzureAd:ClientId"];
                options.Authority = 
                    $"{Configuration["AzureAd:Instance"]}{Configuration["AzureAd:TenantId"]}";
            });
    }
    
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        ...
        app.UseAuthentication();
        app.UseMvc();
    }

Теперь вы можете написать методы в своем веб-API для вызова всех API управления, о которых вы упомянули выше.

  • Второй шаг, который вам нужно выполнить, - включить MSI в функции Azure.

Управляемую обслуживаемую идентификацию (MSI) можно включить через портал Azure. В разделе «Функции платформы» для функции Azure выберите «Удостоверение», как показано ниже, и включите его для параметра «Назначено системой».

Для аутентификации с помощью веб-API нам необходимо представить токен из приложения AD. Любой субъект-служба в AD может аутентифицировать и получать токен this, а также функцию Azure с включенной идентификацией. Обычно для аутентификации с помощью Azure AD требуется комбинация идентификатора клиента / секрета или сертификата ClientId ?. Однако при включенном MSI Azure управляет этими учетными данными за нас в фоновом режиме, и нам не нужно управлять ими самим. Используя класс AzureServiceTokenProvider из Microsoft.Azure.Services.AppAuthentication, пакет NuGet помогает аутентифицировать ресурс с поддержкой MSI с помощью AD.

Чтобы получить доступ к API, нам нужно передать токен из приложения AD в качестве токена-носителя, как показано ниже.

var target = "<AD App Id of Web API>";
var azureServiceTokenProvider = new AzureServiceTokenProvider();
string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync(target);

var wc = new System.Net.Http.HttpClient();
wc.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
var result = await wc.GetAsync("<Secured API URL>");

вы можете проверить это руководство для более подробных шагов:

https://youtu.be/HVruBWuKnYw

https://youtu.be/r4QFBsT2YE8

https://www.rahulpnath.com/blog/how-to-authenticate-azure-function-with-azure-web-app-using-managed-service-identity/

Надеюсь, это поможет.

person Mohit Verma    schedule 06.12.2019