#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. Вы можете отметить это как решение, если на ваш вопрос будет дан ответ. Нажмите на галочку слева.