Руководство. Вызов API Microsoft Graph из приложения универсальная платформа Windows (UWP)

В этом руководстве показано, как создать нативное приложение универсальной платформы Windows (UWP), которое поддерживает вход пользователей и может получить маркер доступа для вызова API Microsoft Graph.

В конце этого руководства приложение вызывает защищенный API-интерфейс с использованием личных учетных записей, таких как outlook.com, live.com и другие. Приложение также вызывает рабочие и учебные учетные записи из любой компании или организации с идентификатором Microsoft Entra.

В этом руководстве рассматриваются следующие темы:

  • создание проекта универсальной платформы Windows (UWP) в Visual Studio;
  • регистрация приложения на портале Azure;
  • добавление кода для поддержки входа и выхода пользователей;
  • добавление кода для вызова API Microsoft Graph;
  • Тестирование приложения

Необходимые компоненты

Принцип работы с руководством

Shows how the sample app generated by this tutorial works

В рамках этого руководства создается приложение UWP, которое обращается к API Microsoft Graph. В этом сценарии маркер добавляется в запросы HTTP в заголовке "Authorization". Получение и возобновление действия маркеров выполняет библиотека проверки подлинности Майкрософт.

Пакеты NuGet для Application Insights

Для работы с руководством необходимы следующие пакеты NuGet:

Библиотека Description
Microsoft.Identity.Client Библиотека проверки подлинности Майкрософт
Microsoft.Graph Клиентская библиотека Microsoft Graph

Настройка проекта

В этом разделе даны пошаговые инструкции по интеграции классического приложения .NET для Windows (XAML) с платформой входа корпорации Майкрософт. После этого приложение сможет выполнять запросы к интерфейсам веб-API, которым требуется маркер, таким как API Microsoft Graph.

В этом руководстве создается приложение, отображающее кнопку, которая запрашивает API Microsoft Graph и кнопку для выхода. В нем также отображаются текстовые поля, содержащие результаты вызовов.

Совет

Чтобы просмотреть полную версию проекта, созданного в этом руководстве, можете скачать его на сайте GitHub.

Создание приложения

  1. Откройте Visual Studio и выберите элемент Создать проект.

  2. В окне Создание проекта выберите шаблон проекта Пустое приложение (универсальное приложение Windows) для C# и щелкните Далее.

  3. В окне Настроить новый проект присвойте проекту имя и щелкните Создать.

  4. Когда появится соответствующий запрос, в поле Новый проект приложения для универсальной платформы Windows выберите произвольные целевую и минимальную версии и щелкните ОК.

    Minimum and Target versions

Добавление библиотеки проверки подлинности Майкрософт в проект

  1. В Visual Studio выберите Сервис>Диспетчер пакетов NuGet>Консоль диспетчера пакетов.

  2. Скопируйте и вставьте следующую команду в окно консоли диспетчера пакетов:

    Install-Package Microsoft.Identity.Client
    Install-Package Microsoft.Graph
    

    Примечание.

    Первая команда позволяет установить библиотеку проверки подлинности Майкрософт (MSAL.NET). MSAL.NET получает, кэширует и обновляет маркеры пользователей для доступа к API-интерфейсам, которые защищены с помощью платформы удостоверений Майкрософт. Вторая позволяет установить клиентскую библиотеку Microsoft Graph для .NET, чтобы обрабатывать проверку подлинности запросов к Microsoft Graph и вызовы этой службы.

Создание пользовательского интерфейса приложения

Visual Studio автоматически создает файл MainPage.xaml как часть шаблона проекта. Откройте этот файл и замените узел Сетка для своего приложения следующим кодом:

<Grid>
    <StackPanel Background="Azure">
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
            <Button x:Name="CallGraphButton" Content="Call Microsoft Graph API" HorizontalAlignment="Right" Padding="5" Click="CallGraphButton_Click" Margin="5" FontFamily="Segoe Ui"/>
            <Button x:Name="SignOutButton" Content="Sign-Out" HorizontalAlignment="Right" Padding="5" Click="SignOutButton_Click" Margin="5" Visibility="Collapsed" FontFamily="Segoe Ui"/>
        </StackPanel>
        <TextBlock Text="API Call Results" Margin="2,0,0,-5" FontFamily="Segoe Ui" />
        <TextBox x:Name="ResultText" TextWrapping="Wrap" MinHeight="120" Margin="5" FontFamily="Segoe Ui"/>
        <TextBlock Text="Token Info" Margin="2,0,0,-5" FontFamily="Segoe Ui" />
        <TextBox x:Name="TokenInfoText" TextWrapping="Wrap" MinHeight="70" Margin="5" FontFamily="Segoe Ui"/>
    </StackPanel>
</Grid>

Получение маркера для API Microsoft Graph с помощью библиотеки проверки подлинности Майкрософт

В этом разделе показано, как получить маркер для API Microsoft Graph с помощью библиотеки проверки подлинности Майкрософт. Внесите изменения в файл MainPage.xaml.cs.

  1. Добавьте в MainPage.xaml.cs следующие ссылки.

    using Microsoft.Identity.Client;
    using Microsoft.Graph;
    using Microsoft.Graph.Models;
    using System.Diagnostics;
    using System.Threading.Tasks;
    using System.Net.Http.Headers;
    
  2. Замените класс MainPage следующим кодом.

    public sealed partial class MainPage : Page
    {
    
        //Set the scope for API call to user.read
        private string[] scopes = new string[] { "user.read" };
    
        // Below are the clientId (Application Id) of your app registration and the tenant information.
        // You have to replace:
        // - the content of ClientID with the Application Id for your app registration
        private const string ClientId = "[Application Id pasted from the application registration portal]";
    
        private const string Tenant = "common"; // Alternatively "[Enter your tenant, as obtained from the Azure portal, e.g. kko365.onmicrosoft.com]"
        private const string Authority = "https://login.microsoftonline.com/" + Tenant;
    
        // The MSAL Public client app
        private static IPublicClientApplication PublicClientApp;
    
        private static string MSGraphURL = "https://graph.microsoft.com/v1.0/";
        private static AuthenticationResult authResult;
    
        public MainPage()
        {
            this.InitializeComponent();
        }
    
        /// <summary>
        /// Call AcquireTokenAsync - to acquire a token requiring user to sign in
        /// </summary>
        private async void CallGraphButton_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                // Sign in user using MSAL and obtain an access token for Microsoft Graph
                GraphServiceClient graphClient = await SignInAndInitializeGraphServiceClient(scopes);
    
                // Call the /me endpoint of Graph
                User graphUser = await graphClient.Me.GetAsync();
    
                // Go back to the UI thread to make changes to the UI
                await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                {
                    ResultText.Text = "Display Name: " + graphUser.DisplayName + "\nBusiness Phone: " + graphUser.BusinessPhones.FirstOrDefault()
                                      + "\nGiven Name: " + graphUser.GivenName + "\nid: " + graphUser.Id
                                      + "\nUser Principal Name: " + graphUser.UserPrincipalName;
                    DisplayBasicTokenInfo(authResult);
                    this.SignOutButton.Visibility = Visibility.Visible;
                });
            }
            catch (MsalException msalEx)
            {
                await DisplayMessageAsync($"Error Acquiring Token:{System.Environment.NewLine}{msalEx}");
            }
            catch (Exception ex)
            {
                await DisplayMessageAsync($"Error Acquiring Token Silently:{System.Environment.NewLine}{ex}");
                return;
            }
        }
                /// <summary>
        /// Signs in the user and obtains an access token for Microsoft Graph
        /// </summary>
        /// <param name="scopes"></param>
        /// <returns> Access Token</returns>
        private static async Task<string> SignInUserAndGetTokenUsingMSAL(string[] scopes)
        {
            // Initialize the MSAL library by building a public client application
            PublicClientApp = PublicClientApplicationBuilder.Create(ClientId)
                .WithAuthority(Authority)
                .WithUseCorporateNetwork(false)
                .WithRedirectUri("https://login.microsoftonline.com/common/oauth2/nativeclient")
                 .WithLogging((level, message, containsPii) =>
                 {
                     Debug.WriteLine($"MSAL: {level} {message} ");
                 }, LogLevel.Warning, enablePiiLogging: false, enableDefaultPlatformLogging: true)
                .Build();
    
            // It's good practice to not do work on the UI thread, so use ConfigureAwait(false) whenever possible.
            IEnumerable<IAccount> accounts = await PublicClientApp.GetAccountsAsync().ConfigureAwait(false);
            IAccount firstAccount = accounts.FirstOrDefault();
    
            try
            {
                authResult = await PublicClientApp.AcquireTokenSilent(scopes, firstAccount)
                                                  .ExecuteAsync();
            }
            catch (MsalUiRequiredException ex)
            {
                // A MsalUiRequiredException happened on AcquireTokenSilentAsync. This indicates you need to call AcquireTokenAsync to acquire a token
                Debug.WriteLine($"MsalUiRequiredException: {ex.Message}");
    
                authResult = await PublicClientApp.AcquireTokenInteractive(scopes)
                                                  .ExecuteAsync()
                                                  .ConfigureAwait(false);
    
            }
            return authResult.AccessToken;
        }
    }
    

Интерактивное получение маркера

Метод AcquireTokenInteractive отображает окно, в котором пользователю предлагается выполнить вход. Когда пользователь впервые запрашивает доступ к защищенному ресурсу, приложение обычно требует выполнить интерактивный вход. Пользователям также может потребоваться выполнить вход при сбое автоматической операции получения маркера, например, если истек срок действия пароля пользователя.

Автоматическое получение маркера пользователя

Метод AcquireTokenSilent обрабатывает получение и обновление маркера без участия пользователя. После первого запуска AcquireTokenInteractive и запроса учетных данных пользователя выполните метод AcquireTokenSilent, чтобы запросить маркеры для последующих вызовов. Этот метод принимает маркеры без дополнительного взаимодействия. Кэширование и возобновление действия маркеров выполняет библиотека проверки подлинности Майкрософт.

Иногда метод AcquireTokenSilent завершается ошибкой. Например, если пользователь вышел из системы или изменил пароль на другом устройстве. Когда библиотека проверки подлинности Майкрософт обнаруживает, что для решения проблемы требуется интерактивное действие, она создает исключение MsalUiRequiredException. Приложение может обработать это исключение двумя способами:

  • Приложение немедленно вызывает AcquireTokenInteractive. Этот вызов приводит к появлению запроса на вход пользователя. Этот подход обычно используется в интернет-приложениях, где пользователю не предоставляется автономное содержимое. Пример, созданный в ходе пошаговой настройки, следует этому шаблону. Вы увидите его в действии при первом запуске примера.

    Так как приложение еще не использовалось, accounts.FirstOrDefault() содержит значение NULL, поэтому создается исключение MsalUiRequiredException.

    Затем код в примере обрабатывает исключение, вызывая AcquireTokenInteractive. Этот вызов приводит к появлению запроса на вход пользователя.

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

Создание экземпляра клиента службы Microsoft Graph путем получения маркера с помощью метода SignInUserAndGetTokenUsingMSAL

В проекте создайте файл с именем TokenProvider.cs: щелкните проект правой кнопкой мыши, выберите "Добавить>пустой элемент".>

Добавьте в созданный файл следующий код:

using Microsoft.Kiota.Abstractions.Authentication;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

namespace UWP_app_MSGraph {
    public class TokenProvider : IAccessTokenProvider {
        private Func<string[], Task<string>> getTokenDelegate;
        private string[] scopes;

        public TokenProvider(Func<string[], Task<string>> getTokenDelegate, string[] scopes) {
            this.getTokenDelegate = getTokenDelegate;
            this.scopes = scopes;
        }

        public Task<string> GetAuthorizationTokenAsync(Uri uri, Dictionary<string, object> additionalAuthenticationContext = default,
            CancellationToken cancellationToken = default) {
            return getTokenDelegate(scopes);
        }

        public AllowedHostsValidator AllowedHostsValidator { get; }
    }
}

Совет

После вставки кода убедитесь, что пространство имен в файле TokenProvider.cs соответствует пространству имен проекта. Это позволит вам проще ссылаться на TokenProvider класс в проекте.

Класс TokenProvider определяет настраиваемый поставщик маркеров доступа, который выполняет указанный метод делегата для получения и возврата маркера доступа.

Добавьте приведенный ниже новый метод в файл MainPage.xaml.cs.

      /// <summary>
     /// Sign in user using MSAL and obtain a token for Microsoft Graph
     /// </summary>
     /// <returns>GraphServiceClient</returns>
     private async static Task<GraphServiceClient> SignInAndInitializeGraphServiceClient(string[] scopes)
     {
         var tokenProvider = new TokenProvider(SignInUserAndGetTokenUsingMSAL, scopes);
         var authProvider = new BaseBearerTokenAuthenticationProvider(tokenProvider);
         var graphClient = new GraphServiceClient(authProvider, MSGraphURL);

         return await Task.FromResult(graphClient);
     }

В этом методе вы используете поставщик TokenProvider маркеров пользовательского доступа для подключения SignInUserAndGetTokenUsingMSAL метода к пакету SDK для Microsoft Graph .NET и создадите прошедший проверку подлинности клиент.

Чтобы использовать BaseBearerTokenAuthenticationProviderфайл MainPage.xaml.cs, добавьте следующую ссылку:

using Microsoft.Kiota.Abstractions.Authentication;

Дополнительные сведения о вызове REST через защищенный API

В этом примере приложения с помощью метода GetGraphServiceClient создается экземпляр GraphServiceClient с применением маркера доступа. Затем используется GraphServiceClient для получения сведений о профиле пользователя из конечной точки me.

Добавление метода для выхода пользователя

Для выхода пользователя добавьте следующий метод в файл MainPage.xaml.cs:

/// <summary>
/// Sign out the current user
/// </summary>
private async void SignOutButton_Click(object sender, RoutedEventArgs e)
{
    IEnumerable<IAccount> accounts = await PublicClientApp.GetAccountsAsync().ConfigureAwait(false);
    IAccount firstAccount = accounts.FirstOrDefault();

    try
    {
        await PublicClientApp.RemoveAsync(firstAccount).ConfigureAwait(false);
        await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
        {
            ResultText.Text = "User has signed out";
            this.CallGraphButton.Visibility = Visibility.Visible;
                this.SignOutButton.Visibility = Visibility.Collapsed;
            });
        }
        catch (MsalException ex)
        {
            ResultText.Text = $"Error signing out user: {ex.Message}";
        }
    }

MSAL.NET использует асинхронные методы для получения маркеров или управления учетными записями. Поэтому нужно поддерживать действия пользовательского интерфейса в потоке пользовательского интерфейса. Именно поэтому нужно вызвать Dispatcher.RunAsync и соблюдать меры предосторожности при вызове ConfigureAwait(false).

Дополнительные сведения о выходе

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

Приложение в этом примере поддерживает одиночного пользователя. Библиотека проверки подлинности Майкрософт поддерживает сценарии одновременного входа пользователя с несколькими учетными записями. Пример — приложение электронной почты, в котором у пользователя есть несколько учетных записей.

Отображение основных сведений о маркере

Добавьте следующий метод в файл MainPage.xaml.cs для отображения основных сведений о маркере:

/// <summary>
/// Display basic information contained in the token. Needs to be called from the UI thread.
/// </summary>
private void DisplayBasicTokenInfo(AuthenticationResult authResult)
{
    TokenInfoText.Text = "";
    if (authResult != null)
    {
        TokenInfoText.Text += $"User Name: {authResult.Account.Username}" + Environment.NewLine;
        TokenInfoText.Text += $"Token Expires: {authResult.ExpiresOn.ToLocalTime()}" + Environment.NewLine;
    }
}

Дополнительные сведения

Маркеры идентификаторов, полученные с использованием OpenID Connect, также содержат небольшой набор данных, относящихся к пользователю. DisplayBasicTokenInfo отображает базовые сведения, содержащиеся в маркере, Эти сведения включают отображаемое имя и идентификатор пользователя. В них также есть сведения о сроке действия маркера и строка, представляющая сам маркер доступа. Если вы несколько раз нажмете кнопку Call Microsoft Graph API (Вызвать API Microsoft Graph), то увидите, что для последующих запросов повторно используется тот же маркер. Также можно заметить, что библиотека проверки подлинности Майкрософт продлила срок действия маркера.

Показать сообщение

Добавьте приведенный ниже новый метод в файл MainPage.xaml.cs.

/// <summary>
/// Displays a message in the ResultText. Can be called from any thread.
/// </summary>
private async Task DisplayMessageAsync(string message)
{
     await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
         () =>
         {
             ResultText.Text = message;
         });
     }

Регистрация приложения

Совет

Действия, описанные в этой статье, могут немного отличаться на портале, с который вы начинаете работу.

Теперь зарегистрируйте свое приложение:

  1. Войдите в Центр администрирования Microsoft Entra как минимум разработчик приложений.
  2. Если у вас есть доступ к нескольким клиентам, используйте значок Параметры в верхнем меню, чтобы переключиться на клиент, в котором вы хотите зарегистрировать приложение из меню каталогов и подписок.
  3. Перейдите к приложениям> удостоверений>Регистрация приложений.
  4. Выберите Создать регистрацию.
  5. Введите имя приложения, например UWP-App-calling-MSGraph. Пользователи приложения могут видеть это имя. Вы можете изменить его позже.
  6. В разделе "Поддерживаемые типы учетных записей" выберите учетные записи в любом каталоге организации (любой каталог Microsoft Entra — Multitenant) и личные учетные записи Майкрософт (например, Skype, Xbox).
  7. Выберите Зарегистрировать.
  8. На странице общих сведений найдите идентификатор приложения (клиента) и скопируйте его. Вернитесь в Visual Studio, откройте файл MainPage.xaml.cs и замените значение ClientId полученным значением.

Настройте проверку подлинности для приложения.

  1. В Центре администрирования Microsoft Entra выберите "Добавить платформу">, а затем выберите мобильные и классические приложения.
  2. В разделе URI перенаправления введите https://login.microsoftonline.com/common/oauth2/nativeclient.
  3. Выберите Настроить.

Настройте разрешения API для приложения.

  1. Выберите Разрешения API>Добавить разрешение.
  2. Выберите Microsoft Graph.
  3. Выберите Делегированные разрешения, выполните поиск строки User.Read и убедитесь, что установлен параметр User.Read.
  4. Если вы внесли изменения, щелкните Добавить разрешения, чтобы сохранить эти изменения.

Включение встроенной проверки подлинности в федеративных доменах (необязательно)

Чтобы включить интегрированные проверка подлинности Windows при использовании с федеративной доменом Microsoft Entra, манифест приложения должен включить дополнительные возможности. Вернитесь к приложению, открытому в Visual Studio.

  1. Откройте файл Package.appxmanifest.

  2. Выберите элемент Возможности и включите следующие параметры:

    • Корпоративная проверка подлинности
    • Частные сети (клиент и сервер)
    • Общие сертификаты пользователей

Важно!

Встроенная проверка подлинности Windows не настроена по умолчанию для этого примера. Приложениям, которые запрашивают возможности Enterprise Authentication или Shared User Certificates, требуется более высокий уровень проверки в Windows Store. Кроме того, не все разработчики желают выполнять проверку более высокого уровня. Включите этот параметр, только если требуется интегрированная проверка подлинности Windows с федеративными доменами Microsoft Entra.

Другой подход к использованию WithDefaultRedirectURI()

В нашем примере используется метод WithRedirectUri("https://login.microsoftonline.com/common/oauth2/nativeclient"). Чтобы применить WithDefaultRedirectURI(), выполните следующие действия:

  1. В MainPage.XAML.cs замените WithRedirectUri на WithDefaultRedirectUri.

    Прежний код

    
    PublicClientApp = PublicClientApplicationBuilder.Create(ClientId)
        .WithAuthority(Authority)
        .WithUseCorporateNetwork(false)
        .WithRedirectUri("https://login.microsoftonline.com/common/oauth2/nativeclient")
        .WithLogging((level, message, containsPii) =>
         {
             Debug.WriteLine($"MSAL: {level} {message} ");
         }, LogLevel.Warning, enablePiiLogging: false, enableDefaultPlatformLogging: true)
        .Build();
    
    

    Обновленный код

    
    PublicClientApp = PublicClientApplicationBuilder.Create(ClientId)
        .WithAuthority("https://login.microsoftonline.com/common")
        .WithUseCorporateNetwork(false)
        .WithDefaultRedirectUri()
        .WithLogging((level, message, containsPii) =>
         {
             Debug.WriteLine($"MSAL: {level} {message} ");
         }, LogLevel.Warning, enablePiiLogging: false, enableDefaultPlatformLogging: true)
        .Build();
    
  2. Найдите правильный URI обратного вызова для приложения, добавив поле redirectURI в файл MainPage.xaml.cs и установив на нем точку останова:

    
    public sealed partial class MainPage : Page
    {
            ...
    
            string redirectURI = Windows.Security.Authentication.Web.WebAuthenticationBroker
                                .GetCurrentApplicationCallbackUri().ToString();
            public MainPage()
            {
                ...
            }
           ...
    }
    
    

    Запустите это приложение и скопируйте значение redirectUri, когда сработает точка останова. Это значение должно выглядеть примерно так: ms-app://s-1-15-2-1352796503-54529114-405753024-3540103335-3203256200-511895534-1429095407/

    После этого добавленную строку кода можно удалить, так как она нужна только для получения этого значения.

  3. В Центре администрирования Microsoft Entra добавьте возвращаемое значение в RedirectUri на панели проверки подлинности .

Тестирование кода

Чтобы протестировать приложение, запустите проект в Visual Studio с помощью клавиши F5. Откроется главное окно:

Application's user interface

Когда будете готовы выполнить тестирование, выберите Call Microsoft Graph API (вызвать API Graph Microsoft). Затем для входа используйте учетную запись организации Microsoft Entra или учетную запись Майкрософт, например live.com или outlook.com. При первом запуске теста приложение отображает окно, где пользователю предлагается войти в систему.

При первом входе в приложение появится экран предоставления согласия, как на представленном ниже изображении. Выберите Да, чтобы дать явное согласие на доступ:

Access consent screen

Ожидаемые результаты

На экране API Call Results (Результаты вызова API) должны отобразиться сведения о профиле пользователя, возвращенные вызовом API Microsoft Graph:

API Call Results screen

Вы также увидите основные сведения о маркере, полученные с помощью AcquireTokenInteractive или AcquireTokenSilent, в окне Token Info (Сведения о маркере):

Свойство Формат Description
Username user@domain.com Имя пользователя, которое позволяет его идентифицировать.
Token Expires DateTime Это время, когда истекает срок действия маркера. Библиотека проверки подлинности Майкрософт продлевает срок действия, возобновляя действие маркера по мере необходимости.

Дополнительные сведения об областях и делегированных разрешениях

Для чтения профиля пользователя API Microsoft Graph требуется область user.read. По умолчанию эта область добавляется в каждое приложение, зарегистрированное на портале регистрации приложений. Для других API Microsoft Graph, а также для пользовательских API вашего внутреннего сервера могут потребоваться дополнительные области. Например, API Microsoft Graph нужна область Calendars.Read для отображения календарей пользователя.

Чтобы из контекста приложения получать доступ к календарям пользователя, добавьте делегированное разрешение Calendars.Read в сведения о регистрации приложения. Затем добавьте область Calendars.Read в вызов acquireTokenSilent.

При увеличении количества областей от пользователя могут потребоваться дополнительные согласия.

Известные проблемы

Проблема 1

При входе в приложение в федеративном домене Microsoft Entra вы получаете одно из следующих сообщений об ошибке:

  • "No valid client certificate found in the request" (В запросе отсутствует действительный клиентский сертификат).
  • "No valid certificates found in the user's certificate store" (В хранилище сертификатов пользователя отсутствуют действительные сертификаты).
  • "Try again choosing a different authentication method" (Попробуйте еще раз, выбрав другой метод проверки подлинности).

Причина. Не включены возможности корпоративного уровня и сертификатов.

Решение. Выполните действия, описанные в разделе "Включение интегрированной проверки подлинности в федеративных доменах (необязательно)".

Проблема 2

Вы включили встроенную проверку подлинности в федеративных доменах и пытаетесь использовать Windows Hello на компьютере под управлением Windows 10 для входа в среду с настроенной многофакторной проверкой подлинности. Появится список сертификатов. Если вы решили использовать собственный ПИН-код, окно ПИН-кода не отображается.

Причина. Эта проблема является известным ограничением брокера веб-проверки подлинности в приложениях UWP, работающих на настольных компьютерах Windows 10. В Windows 10 Mobile он работает нормально.

Обходной путь. Выберите Sign in with other options (Вход с другими параметрами). Затем выберите Sign in with a username and password (Вход с использованием имени пользователя и пароля). Выберите Provide your password (Ввести пароль). После этого пройдите процесс проверки подлинности по телефону.

Справка и поддержка

Если вам нужна помощь, если вы хотите сообщить о проблеме или узнать о доступных вариантах поддержки, воспользуйтесь статьей Возможности получения поддержки и справки для разработчиков.

Следующие шаги

Подробнее об использовании библиотеки аутентификации Майкрософт (MSAL) для авторизации и аутентификации в приложениях .NET: