AcquireTokenInteractive: Что мне делать, когда пользователь отказывается от процесса входа в систему?

#oauth-2.0 #msal #azure-authentication

#oauth-2.0 #msal #azure-аутентификация

Вопрос:

Я пишу консольное приложение, используя некоторый код, который я нашел на GitHub. Приведенный ниже код работает нормально.

Если токен кэширован, он извлекается, и приложение продолжается. (Приобретайте безмолвно)

Если токен не найден, я запрашиваю у пользователя его учетные данные. Они попадают на сайт входа в систему компании. Они входят в систему, и приложение продолжается. (AcquireTokenInteractive)

Однако, допустим, пользователь просто передумал и отказался от процесса входа в систему, закрыв веб-браузер. Теперь мой код просто сидит там. Все, что вы видите, — это командное окно, которое ничего не делает.

Он явно ждет какого-то ответа, который никогда не придет, поскольку веб-браузер больше не будет взаимодействовать с моим консольным приложением.

Как я могу получить сообщение от закрывающегося веб-браузера, чтобы мое консольное приложение знало, что нужно создать исключение или каким-то образом обработать заброшенный логин?

 namespace PublicClientAuthentication
{
    class AuthenticationProvider : IAuthenticationProvider
    {
        IPublicClientApplication _clientApp;
        private string[] _scopes;
        public AuthenticationProvider(IPublicClientApplication app, string[] scopes)
        {
            _clientApp = app;
            _scopes = scopes;

        }

        public async Task AuthenticateRequestAsync(HttpRequestMessage request)
        {
            AuthenticationResult authResult = null;


            try
            {
                var accounts = await _clientApp.GetAccountsAsync();

                authResult = await _clientApp.AcquireTokenSilent(_scopes.ToArray(), accounts.FirstOrDefault()).ExecuteAsync().ConfigureAwait(false);


            }
            catch (MsalUiRequiredException ex)
            {
               System.Diagnostics.Debug.WriteLine(ex);

                authResult = await _clientApp.AcquireTokenInteractive(_scopes)
                    .WithPrompt(Microsoft.Identity.Client.Prompt.ForceLogin)
                    .ExecuteAsync().ConfigureAwait(false);
            }
            catch (MsalServiceException ex)
            {
                System.Diagnostics.Debug.WriteLine(ex);

            }
            catch (MsalClientException ex)
            {
                System.Diagnostics.Debug.WriteLine(ex);

                authResult = await _clientApp.AcquireTokenInteractive(_scopes).ExecuteAsync();
            }
            catch (Exception e)
            {
                System.Diagnostics.Debug.Write(e);
            }

            request.Headers.Add("Authorization", authResult.CreateAuthorizationHeader());

        }


    }
}
 

Ответ №1:

Добавление с помощью useembeddedwebview сделало свое дело.

Этот код работает в .NET Framework. Это не работает с .NET Core

 authResult = await _clientApp.AcquireTokenInteractive(_scopes)
                        .WithUseEmbeddedWebView(true)
                        .WithPrompt(Prompt.ForceLogin)
                        .ExecuteAsync().ConfigureAwait(false);
 

Комментарии:

1. Вы можете отметить это как решение, если на ваш вопрос будет дан ответ. Нажмите на галочку слева.