Поддерживается ли проверка подлинности между функциями Azure с MSI

Я создал 2 приложения-функции Azure, оба из которых настроены на аутентификацию / авторизацию, поэтому приложение AD было создано для обоих. Я хотел бы настроить AD Auth от одной функции к другой, используя MSI. Я настраиваю клиентскую функцию с идентификатором управляемого сервиса, используя шаблон ARM. Я создал простую тестовую функцию для получения токена доступа, и он возвращает: Microsoft.Azure.Services.AppAuthentication: ответ токена не соответствует ожидаемому формату.

try {
    var azureServiceTokenProvider = new AzureServiceTokenProvider();
    string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://myapp-registration-westus-dev.azurewebsites.net/");
    log.Info($"Access Token: {accessToken}");
    return req.CreateResponse(new {token = accessToken});
}
catch(Exception ex) {
    log.Error("Error", ex);
    throw;
}

2 ответа

Решение

Да, есть способ сделать это. Я объясню на высоком уровне, а затем добавлю элемент в бэклог документации MSI, чтобы написать соответствующее руководство для этого.

Вам нужно следовать этому примеру проверки подлинности Azure AD, но настроить и реализовать только части для TodoListService: https://github.com/Azure-Samples/active-directory-dotnet-daemon.

Вместо этого роль TodoListDaemon будет играть управляемая идентификация службы. Поэтому вам не нужно регистрировать приложение TodoListDaemon в Azure AD, как указано в файле readme. Просто включите MSI на вашей ВМ / Служба приложений / Функция.

В коде на стороне клиента, когда вы делаете вызов MSI (на виртуальной машине или в службе функций или приложения), укажите URI-идентификатор AppID TodoListService в качестве параметра ресурса. MSI подберет для вас токен для этой аудитории.

Код в примере TodoListService покажет вам, как проверить этот токен, когда вы его получите.

По сути, вам нужно зарегистрировать приложение в Azure AD, присвоить ему URI AppID и использовать этот URI AppID в качестве параметра ресурса при вызове MSI. Затем подтвердите токен, который вы получите на службе / получателе.

Пожалуйста, проверьте правильность идентификатора ресурса, используемого " https://myapp-registration-westus-dev.azurewebsites.net/ ". Я выполнил шаги по настройке аутентификации Azure AD и использовал тот же код, что и вы, и смог получить токен. https://docs.microsoft.com/en-us/azure/app-service/app-service-mobile-how-to-configure-active-directory-authentication

Вы также можете запустить этот код, чтобы проверить точную ошибку, возвращаемую MSI. Оставьте сообщение об ошибке, если это не поможет решить проблему.

HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Secret", Environment.GetEnvironmentVariable("MSI_SECRET"));
var response = await client.GetAsync(String.Format("{0}/?resource={1}&api-version={2}", Environment.GetEnvironmentVariable("MSI_ENDPOINT"), "https://myapp-registration-westus-dev.azurewebsites.net/", "2017-09-01"));
string msiResponse = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
log.Info($"MSI Response: {msiResponse}");

Обновление:- Этот файл project.json и run.csx работают для меня. Примечание. Project.json ссылается на.NET 4.6, а в соответствии с документацией по функциям Azure (ссылка в комментариях).NET 4.6 на данный момент является единственной поддерживаемой версией. Вам не нужно загружать указанную сборку снова. Скорее всего, ваша проблема связана с неправильной загрузкой netstandard сборки вместо net452.

Поддерживается только.NET Framework 4.6, поэтому убедитесь, что в вашем файле project.json указан net46, как показано здесь. Когда вы загружаете файл project.json, среда выполнения получает пакеты и автоматически добавляет ссылки на сборки пакетов. Вам не нужно добавлять директивы #r "AssemblyName". Чтобы использовать типы, определенные в пакетах NuGet, добавьте необходимые операторы using в файл run.csx.

project.json

{
  "frameworks": {
    "net46":{
      "dependencies": {
        "Microsoft.Azure.Services.AppAuthentication": "1.0.0-preview"
      }
    }
   }
}

run.csx

using Microsoft.Azure.Services.AppAuthentication;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    try
    {
        var azureServiceTokenProvider = new AzureServiceTokenProvider();
        string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://vault.azure.net/");
        log.Info($"Access Token: {accessToken}");
        return req.CreateResponse(new {token = accessToken});
    }
    catch(Exception ex) 
    {
        log.Error("Error", ex);
        throw;
    }    
}
Другие вопросы по тегам