Приложение WPF Доступ к функции Azure с помощью AAD - PullRequest
0 голосов
/ 29 декабря 2018

Я создал образец функции в функциях Azure.Я обеспечил это с помощью AAD.Я могу успешно перейти по URL-адресу, войти в систему с моей учетной записью Office 365. После запуска функции.

Я создал другое приложение в AAD для своего клиента WPF.Я могу успешно войти в клиент WPF с моими учетными данными Office 365.Затем я создал разрешение для этого приложения в AAD для доступа к приложению AAD функции Azure.

Вот моя проблема: как использовать токен входа из моего приложения WPF для доступа к функциям Azure?

Я прошел около дюжины различных учебных пособий, показывающих, как это настроить, и каждому из них не удается фактически подтвердить подлинность вызова функции.

Чего мне не хватает?

1 Ответ

0 голосов
/ 13 января 2019

После долгих исследований, проб и ошибок я наконец-то смог войти в свою учетную запись Office365 и получить доступ к функции Azure.

Шаг 1. Зарегистрируйте приложение службы приложений в Azure Active Directory

  1. Войдите на портал Azure и перейдите к своему приложению службы приложений.Скопируйте URL своего приложения в свою функцию Azure.Это будет использоваться для настройки регистрации приложения Azure Active Directory.
  2. Перейдите в Active Directory, затем выберите регистрации приложения, затем нажмите «Регистрация нового приложения» вверху, чтобы начать регистрацию нового приложения.
  3. На странице «Создание» введите имя для регистрации приложения, выберите тип веб-приложения / API, в поле URL-адрес входа вставьте URL-адрес приложения (из шага 1).Затем нажмите «Создать».
  4. Через несколько секунд вы увидите новую регистрацию приложения, которую вы только что создали.
  5. После добавления регистрации приложения нажмите на имя регистрации приложения, нажмите наНастройки вверху, затем нажмите Свойства
  6. В поле URI идентификатора приложения вставьте URL-адрес приложения (из шага 1), а также вставьте URL-адрес домашней страницы в URL-адрес приложения (из шага 1) какхорошо, затем нажмите Сохранить
  7. Теперь нажмите на URL-адреса ответов, отредактируйте URL-адрес ответа, вставьте URL-адрес приложения (с шага 1), измените протокол, чтобы убедиться, что у вас протокол https: // (не *)1018 * затем добавляется в конец URL, /.auth/login/aad/callback (например, https://contoso.azurewebsites.net/.auth/login/aad/callback). Нажмите Сохранить.
  8. На этом этапе скопируйте идентификатор приложения для приложенияСохраните его для последующего использования. Он понадобится вам для настройки приложения службы приложений.
  9. Закройте страницу зарегистрированного приложения. На странице регистрации приложений нажмите кнопку Конечные точки вверху, затем скопируйте метаданные федерации.DocuURL-адрес.
  10. Откройте новое окно браузера и перейдите к URL-адресу, вставив и перейдя на страницу XML.В верхней части документа находится элемент EntityDescriptor.Найдите атрибут entityID и скопируйте его значение.Он служит вашим URL эмитента.Приложение будет настроено для его использования позже.

Шаг 2. Добавьте информацию Azure Active Directory в свое приложение службы приложений

  1. Вернувшись на портал Azure, перейдите на страницуПриложение службы приложений.Нажмите Аутентификация / Авторизация.Если функция аутентификации / авторизации не включена, установите переключатель в положение «Вкл.».Нажмите Azure Active Directory в разделе «Поставщики проверки подлинности», чтобы настроить приложение.(Необязательно) По умолчанию служба приложений обеспечивает аутентификацию, но не ограничивает авторизованный доступ к содержимому вашего сайта и API-интерфейсам.Вы должны авторизовать пользователей в коде вашего приложения.Задайте действие, которое требуется выполнить, когда запрос не аутентифицирован, на Вход в систему с Azure Active Directory.Этот параметр требует, чтобы все запросы проходили проверку подлинности, а все неаутентифицированные запросы перенаправлялись в Azure Active Directory для проверки подлинности.
  2. В конфигурации проверки подлинности Active Directory нажмите кнопку «Дополнительно» в разделе «Режим управления».Вставьте идентификатор приложения в поле «Идентификатор клиента» (из шага 8). Затем нажмите кнопку «ОК».
  3. На странице конфигурации проверки подлинности Active Directory нажмите «Сохранить».

Шаг 3 - Настройте собственныйклиентское приложение

Azure Active Directory также позволяет регистрировать собственные клиенты, что обеспечивает больший контроль над сопоставлением разрешений.Это необходимо, если вы хотите выполнить вход с использованием библиотеки, такой как библиотека аутентификации Active Directory.

  1. Перейдите в Azure Active Directory на портале Azure.
  2. В левой навигационной панели выберитевыберите приложение регистрации.Нажмите «Регистрация нового приложения» вверху.
  3. На странице «Создание» введите имя для регистрации приложения.Выберите Собственный в Типе приложения.
  4. В поле URI перенаправления введите конечную точку /.auth/login/done вашего сайта, используя схему HTTPS.Это значение должно быть похоже на https://contoso.azurewebsites.net/.auth/login/done. При создании приложения Windows вместо этого используйте SID пакета в качестве URI.
  5. Нажмите кнопку Создать.
  6. После добавления регистрации приложения выберите ее, чтобы открыть.Найдите идентификатор приложения и запишите это значение.
  7. Нажмите Все настройки> Требуемые разрешения> Добавить> Выберите API.
  8. Введите имя приложения службы приложений, которое вы зарегистрировали ранее длянайдите его, затем выберите его и нажмите «Выбрать».
  9. Выберите «Доступ».Затем нажмите «Выбрать».Затем нажмите Готово.

Приведенные выше указания были взяты из https://docs.microsoft.com/en-us/azure/app-service/configure-authentication-provider-aad?toc=%2fazure%2fazure-functions%2ftoc.json

Ниже приведены мои изменения, чтобы заставить его работать с приложением WPF, вызывающим функцию Azure

Шаг 4. Авторизация клиентского приложения в приложении-службе

  1. Скопируйте идентификатор клиентского приложения из шага 3:
  2. Откройте Azure Active Directory
  3. Нажмите на регистрации приложений (предварительный просмотр)
  4. Нажмите на приложение-службу, зарегистрированное на шаге 1
  5. Нажмите Expose a API
  6. В разделе Авторизованные клиентские приложения нажмите Добавить клиентское приложение.
  7. Вставьте идентификатор клиента и нажмите на область действия https://{your имя клиента} .onmicrosoft.com / {Идентификатор вашего сервисного приложения} / user_impersonation
  8. Нажмите Добавить приложение

Шаг 5 - Сделать сервисное приложение мультитенантным

Откройте Azure Active Directory Нажмите на регистрации приложений (предварительный просмотр) Нажмите на приложение-службу, зарегистрированное на шаге 1 Нажмите Аутентификация В разделе Поддерживаемые типы учетных записей выберите «Учетные записи в любом организационном каталоге» Вы получите ошибку.Это из-за шага 1 подэтап 6. Нам нужно создать URI приложения на основе домена клиента {tenantname} .onmicrosoft.com Перейдите к старым регистрациям приложения (так как это недоступно в приложениирегистрации (предварительный просмотр), если вы не отредактируете манифест) Выберите приложение-службу (вам может потребоваться нажать кнопку просмотреть все приложения) Нажмите Настройки.Затем нажмите «Свойства». Под URI идентификатора приложения измените его на https://{ad имя арендатора} .onmicrosoft.com / {Идентификатор приложения службы} Убедитесь, что для Multi-tenanted установлено значение Да (это должно быть из-за шага 5 подэтап 6.)

Шаг 6 - Добавить область действия для функции APP

  1. Откройте приложение-функцию на портале Azure и перейдите кAuthenticaiton
  2. Измените параметры 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();
        }
    }
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...