Поддерживается ли проверка подлинности между функциями 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;
}
}