Создание собственного клиентского приложения с помощью общедоступных клиентов OAuth с AD FS 2016 или более поздней версии

Обзор

В этой статье показано, как создать собственное приложение, которое взаимодействует с веб-API, защищенным AD FS 2016 или более поздней версии.

  1. Приложение .Net TodoListClient WPF использует библиотеку проверки подлинности Active Directory (ADAL) для получения маркера доступа JWT из Azure Active Directory (Azure AD) через протокол OAuth 2.0
  2. Маркер доступа используется в качестве маркера носителя для проверки подлинности пользователя при вызове конечной точки /todolist веб-API TodoListService. Мы будем использовать пример приложения для Azure AD здесь, а затем изменить его для AD FS 2016 или более поздней версии.

Application overivew

Предварительные требования

Ниже приведен список предварительных требований, необходимых перед завершением работы с этим документом. В этом документе предполагается, что служба AD FS установлена и создана ферма AD FS.

  • клиентские средства GitHub
  • AD FS в Windows Server 2016 или более поздней версии
  • Visual Studio 2013 или более поздней версии

Создание примера пошагового руководства

Создание группы приложений в AD FS

  1. В разделе "Управление AD FS" щелкните Группы приложений правой кнопкой мыши и выберите Добавить группу приложений.

  2. В мастере групп приложений введите любое имя, например NativeToDoListAppGroup. Выберите собственное приложение, обращающееся к шаблону веб-API . Щелкните Далее. Add application group

  3. На странице собственного приложения запишите идентификатор, созданный AD FS. Это идентификатор, с помощью которого AD FS распознает общедоступное клиентское приложение. Скопируйте значение идентификатора клиента. Он будет использоваться позже в качестве значения для ida:ClientId в коде приложения. Если вы хотите указать любой пользовательский идентификатор здесь. URI перенаправления — это любое произвольное значение, например put https://ToDoListClientNative app

  4. На странице "Настройка веб-API" задайте значение идентификатора для веб-API. В этом примере это должно быть значение URL-адреса SSL , в котором должно выполняться веб-приложение. Это значение можно получить, щелкнув свойства проекта TooListServer в решении. Позже он будет использоваться в качестве значения todo:TodoListResourceId в App.config файле собственного клиентского приложения, а также в качестве todo:TodoListBaseAddress. Web API

  5. Перейдите к политике применения контроль доступа и настройте разрешения приложения со значениями по умолчанию. Страница сводки должна выглядеть следующим образом. Summary

Нажмите кнопку "Далее", а затем завершите работу мастера.

Добавление утверждения NameIdentifier в список выданных утверждений

Демонстрационное приложение использует значение в утверждении NameIdentifier в различных местах. В отличие от Azure AD, AD FS по умолчанию не выдает утверждение NameIdentifier. Поэтому необходимо добавить правило утверждения для выдачи утверждения NameIdentifier, чтобы приложение пользовалось правильным значением. В этом примере заданное имя пользователя выдается в качестве значения NameIdentifier для пользователя в токене. Чтобы настроить правило утверждения, откройте только что созданную группу приложений и дважды щелкните веб-API. Перейдите на вкладку "Правила преобразования выдачи" и нажмите кнопку "Добавить правило". В качестве типа правила утверждения выберите настраиваемое правило утверждения, а затем добавьте правило утверждения, как показано ниже.

c:[Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"]
 => issue(store = "Active Directory", types = ("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"), query = ";givenName;{0}", param = c.Value);

NameIdentifier claim rule

Изменение кода приложения

В этом разделе описывается, как скачать пример веб-API и изменить его в Visual Studio. Мы будем использовать пример Azure AD, который находится здесь.

Чтобы скачать пример проекта, используйте Git Bash и введите следующее:

git clone https://github.com/Azure-Samples/active-directory-dotnet-native-desktop

Изменение Объекта ToDoListClient

Этот проект в решении представляет собственное клиентское приложение. Необходимо убедиться, что клиентское приложение знает следующее:

  1. Куда перейти, чтобы получить проверку подлинности пользователя при необходимости?
  2. Какой идентификатор должен предоставить клиенту центр проверки подлинности (AD FS)?
  3. Каков идентификатор ресурса, на который мы запрашиваем маркер доступа?
  4. Что такое базовый адрес веб-API?

Для получения приведенных выше сведений в собственное клиентское приложение необходимы следующие изменения кода.

App.config

  • Добавьте ключ ida:Authority со значением, изображающим службу AD FS. Например: https://fs.contoso.com/adfs/

  • Измените ключ ida:ClientId со значением идентификатора клиента на странице собственного приложения во время создания группы приложений в AD FS. Например, 3f07368b-6efd-4f50-a330-d93853f4c8555

  • Измените todo:todo:TodoListResourceId со значением идентификатора на странице "Настройка веб-API " во время создания группы приложений в AD FS. Например: https://localhost:44321/

  • Измените значение todo:TodoListBaseAddress со значением идентификатора на странице "Настройка веб-API " во время создания группы приложений в AD FS. Например: https://localhost:44321/

  • Задайте значение ida:RedirectUri со значением из URI перенаправления на странице собственного приложения во время создания группы приложений в AD FS. Например: https://ToDoListClient

  • Для удобства чтения можно удалить или закомментировать ключ для ida:Tenant и ida:AADInstance.

    App config

MainWindow.xaml.cs

  • Закомментируйте строку для aadInstance, как показано ниже.

    // private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];

  • Добавьте значение центра, как показано ниже.

    private static string authority = ConfigurationManager.AppSettings["ida:Authority"];

  • Удаление строки для создания значения центра из aadInstance и клиента

    private static string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);

  • В функции MainWindow измените экземпляр authContext на

    authContext = new AuthenticationContext(authority,false);

    ADAL не поддерживает проверку AD FS в качестве центра и поэтому нам нужно передать флаг ложного значения для параметра validateAuthority.

    Main window

Изменение TodoListService

В этом проекте требуются два файла: Web.config и Startup.Auth.cs. Web.Config изменения необходимы для получения правильных значений параметров. Изменения Startup.Auth.cs необходимы для настройки WebAPI для проверки подлинности в AD FS, а не в Azure AD.

Web.config

  • Закомментируйте ключ ida:Tenant , так как нам не нужен
  • Добавьте ключ для ida:Authority со значением, указывающим полное доменное имя службы федерации, например: https://fs.contoso.com/adfs/
  • Измените ключ ida:Audience со значением идентификатора веб-API, указанного на странице "Настройка веб-API " во время добавления группы приложений в AD FS.
  • Добавьте key ida:AdfsMetadataEndpoint со значением, соответствующим URL-адресу метаданных федерации службы AD FS, например: https://fs.contoso.com/federationmetadata/2007-06/federationmetadata.xml

Web config

Startup.Auth.cs

Измените функцию ConfigureAuth, как показано ниже.

    public void ConfigureAuth(IAppBuilder app)
    {
        app.UseActiveDirectoryFederationServicesBearerAuthentication(
            new ActiveDirectoryFederationServicesBearerAuthenticationOptions
            {
                MetadataEndpoint = ConfigurationManager.AppSettings["ida:AdfsMetadataEndpoint"],
                TokenValidationParameters = new TokenValidationParameters()
                {
                    SaveSigninToken = true,
                    ValidAudience = ConfigurationManager.AppSettings["ida:Audience"]
                }

            });
    }

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

  1. В решении NativeClient-DotNet щелкните правой кнопкой мыши и перейдите к свойствам. Измените Project запуска, как показано ниже, на несколько проектов запуска и задайте для параметра TodoListClient и TodoListService значение Start. Solution properties

  2. Нажмите клавишу F5 или выберите "Продолжить отладку > " в строке меню. При этом запустится как собственное приложение, так и WebAPI. Нажмите кнопку входа в собственное приложение, и откроется интерактивный вход из AD AL и перенаправляется в службу AD FS. Введите учетные данные допустимого пользователя. Screenshot showing the sign in dialog box.

На этом шаге собственное приложение перенаправляется в AD FS и получил маркер идентификатора и маркер доступа для веб-API.

  1. Введите элемент для выполнения в текстовом поле и нажмите кнопку "Добавить элемент". На этом шаге приложение обращается к веб-API, чтобы добавить элемент do, и для этого представляет маркер доступа к WebAPI, полученный из AD FS. Веб-API соответствует значению аудитории, чтобы убедиться, что маркер предназначен для него и проверяет подпись маркера с помощью сведений из метаданных федерации.

Sign-in

Next Steps

Разработка AD FS