После долгих исследований, проб и ошибок я наконец-то смог войти в свою учетную запись Office365 и получить доступ к функции Azure.
Шаг 1. Зарегистрируйте приложение службы приложений в Azure Active Directory
- Войдите на портал Azure и перейдите к своему приложению службы приложений.Скопируйте URL своего приложения в свою функцию Azure.Это будет использоваться для настройки регистрации приложения Azure Active Directory.
- Перейдите в Active Directory, затем выберите регистрации приложения, затем нажмите «Регистрация нового приложения» вверху, чтобы начать регистрацию нового приложения.
- На странице «Создание» введите имя для регистрации приложения, выберите тип веб-приложения / API, в поле URL-адрес входа вставьте URL-адрес приложения (из шага 1).Затем нажмите «Создать».
- Через несколько секунд вы увидите новую регистрацию приложения, которую вы только что создали.
- После добавления регистрации приложения нажмите на имя регистрации приложения, нажмите наНастройки вверху, затем нажмите Свойства
- В поле URI идентификатора приложения вставьте URL-адрес приложения (из шага 1), а также вставьте URL-адрес домашней страницы в URL-адрес приложения (из шага 1) какхорошо, затем нажмите Сохранить
- Теперь нажмите на URL-адреса ответов, отредактируйте URL-адрес ответа, вставьте URL-адрес приложения (с шага 1), измените протокол, чтобы убедиться, что у вас протокол https: // (не *)1018 * затем добавляется в конец URL, /.auth/login/aad/callback (например, https://contoso.azurewebsites.net/.auth/login/aad/callback). Нажмите Сохранить.
- На этом этапе скопируйте идентификатор приложения для приложенияСохраните его для последующего использования. Он понадобится вам для настройки приложения службы приложений.
- Закройте страницу зарегистрированного приложения. На странице регистрации приложений нажмите кнопку Конечные точки вверху, затем скопируйте метаданные федерации.DocuURL-адрес.
- Откройте новое окно браузера и перейдите к URL-адресу, вставив и перейдя на страницу XML.В верхней части документа находится элемент EntityDescriptor.Найдите атрибут entityID и скопируйте его значение.Он служит вашим URL эмитента.Приложение будет настроено для его использования позже.
Шаг 2. Добавьте информацию Azure Active Directory в свое приложение службы приложений
- Вернувшись на портал Azure, перейдите на страницуПриложение службы приложений.Нажмите Аутентификация / Авторизация.Если функция аутентификации / авторизации не включена, установите переключатель в положение «Вкл.».Нажмите Azure Active Directory в разделе «Поставщики проверки подлинности», чтобы настроить приложение.(Необязательно) По умолчанию служба приложений обеспечивает аутентификацию, но не ограничивает авторизованный доступ к содержимому вашего сайта и API-интерфейсам.Вы должны авторизовать пользователей в коде вашего приложения.Задайте действие, которое требуется выполнить, когда запрос не аутентифицирован, на Вход в систему с Azure Active Directory.Этот параметр требует, чтобы все запросы проходили проверку подлинности, а все неаутентифицированные запросы перенаправлялись в Azure Active Directory для проверки подлинности.
- В конфигурации проверки подлинности Active Directory нажмите кнопку «Дополнительно» в разделе «Режим управления».Вставьте идентификатор приложения в поле «Идентификатор клиента» (из шага 8). Затем нажмите кнопку «ОК».
- На странице конфигурации проверки подлинности Active Directory нажмите «Сохранить».
Шаг 3 - Настройте собственныйклиентское приложение
Azure Active Directory также позволяет регистрировать собственные клиенты, что обеспечивает больший контроль над сопоставлением разрешений.Это необходимо, если вы хотите выполнить вход с использованием библиотеки, такой как библиотека аутентификации Active Directory.
- Перейдите в Azure Active Directory на портале Azure.
- В левой навигационной панели выберитевыберите приложение регистрации.Нажмите «Регистрация нового приложения» вверху.
- На странице «Создание» введите имя для регистрации приложения.Выберите Собственный в Типе приложения.
- В поле URI перенаправления введите конечную точку /.auth/login/done вашего сайта, используя схему HTTPS.Это значение должно быть похоже на https://contoso.azurewebsites.net/.auth/login/done. При создании приложения Windows вместо этого используйте SID пакета в качестве URI.
- Нажмите кнопку Создать.
- После добавления регистрации приложения выберите ее, чтобы открыть.Найдите идентификатор приложения и запишите это значение.
- Нажмите Все настройки> Требуемые разрешения> Добавить> Выберите API.
- Введите имя приложения службы приложений, которое вы зарегистрировали ранее длянайдите его, затем выберите его и нажмите «Выбрать».
- Выберите «Доступ».Затем нажмите «Выбрать».Затем нажмите Готово.
Приведенные выше указания были взяты из https://docs.microsoft.com/en-us/azure/app-service/configure-authentication-provider-aad?toc=%2fazure%2fazure-functions%2ftoc.json
Ниже приведены мои изменения, чтобы заставить его работать с приложением WPF, вызывающим функцию Azure
Шаг 4. Авторизация клиентского приложения в приложении-службе
- Скопируйте идентификатор клиентского приложения из шага 3:
- Откройте Azure Active Directory
- Нажмите на регистрации приложений (предварительный просмотр)
- Нажмите на приложение-службу, зарегистрированное на шаге 1
- Нажмите Expose a API
- В разделе Авторизованные клиентские приложения нажмите Добавить клиентское приложение.
- Вставьте идентификатор клиента и нажмите на область действия https://{your имя клиента} .onmicrosoft.com / {Идентификатор вашего сервисного приложения} / user_impersonation
- Нажмите Добавить приложение
Шаг 5 - Сделать сервисное приложение мультитенантным
Откройте Azure Active Directory Нажмите на регистрации приложений (предварительный просмотр) Нажмите на приложение-службу, зарегистрированное на шаге 1 Нажмите Аутентификация В разделе Поддерживаемые типы учетных записей выберите «Учетные записи в любом организационном каталоге» Вы получите ошибку.Это из-за шага 1 подэтап 6. Нам нужно создать URI приложения на основе домена клиента {tenantname} .onmicrosoft.com Перейдите к старым регистрациям приложения (так как это недоступно в приложениирегистрации (предварительный просмотр), если вы не отредактируете манифест) Выберите приложение-службу (вам может потребоваться нажать кнопку просмотреть все приложения) Нажмите Настройки.Затем нажмите «Свойства». Под URI идентификатора приложения измените его на https://{ad имя арендатора} .onmicrosoft.com / {Идентификатор приложения службы} Убедитесь, что для Multi-tenanted установлено значение Да (это должно быть из-за шага 5 подэтап 6.)
Шаг 6 - Добавить область действия для функции APP
- Откройте приложение-функцию на портале Azure и перейдите кAuthenticaiton
- Измените параметры Active Directory, чтобы разрешить токен-аудиториям полное значение разрешения API-области из IE приложения службы
https://{AD TENANT} .onmicrosoft.com /{SERVICE APP ID} / user_impersonation
Теперь для кода
Из вашего клиентского приложения.Установить nuget Microsoft.Identity.Client
using Microsoft.Identity.Client;
using Newtonsoft.Json.Linq;
using System;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
namespace TestAzureFunctionLogin
{
public class ManualTestApp
{
static string ClientId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; //replace with AppID from Client App Azure AD registration
static string ServiceId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; //replace with AppID from Service App Azure AD registration
static string Scope = $"{ServiceId}/user_impersonation";
static string Authority = "https://login.microsoftonline.com/organizations";
string[] _scopes => new string[] { Scope };
private PublicClientApplication _clientApp = new PublicClientApplication(ClientId, Authority);
private AuthenticationResult authResult;
public PublicClientApplication ClientApp => _clientApp;
public async Task LoginAsync()
{
var user = (await ClientApp.GetAccountsAsync()).FirstOrDefault();
authResult = await ClientApp.AcquireTokenAsync(_scopes, user);
}
public async Task<string> CallAzureFunction(string url)
{
return await GetHttpContentWithToken(url, authResult.AccessToken);
}
//Code taken from somewhere on the Microsoft Website
public async Task<string> GetHttpContentWithToken(string url, string token)
{
var httpClient = new System.Net.Http.HttpClient();
System.Net.Http.HttpResponseMessage response;
try
{
var request = new System.Net.Http.HttpRequestMessage(System.Net.Http.HttpMethod.Get, url);
//Add the token in Authorization header
request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
response = await httpClient.SendAsync(request);
var content = await response.Content.ReadAsStringAsync();
return content;
}
catch (Exception ex)
{
return ex.ToString();
}
}
}
}