private async Task <Uri> SeleniumAcquireAuthAsync( Uri authorizationUri, Uri redirectUri, CancellationToken cancellationToken) { using (var driver = InitDriverAndGoToUrl(authorizationUri.OriginalString)) using (var listener = new SingleMessageTcpListener(redirectUri.Port)) // starts listening { Uri authCodeUri = null; var listenForAuthCodeTask = listener.ListenToSingleRequestAndRespondAsync( (uri) => { Trace.WriteLine("Intercepted an auth code url: " + uri.ToString()); authCodeUri = uri; return(GetMessageToShowInBroswerAfterAuth(uri)); }, cancellationToken); try { // Run the tcp listener and the selenium automation in parallel var seleniumAutomationTask = Task.Run(() => { _seleniumAutomationLogic(driver); }); await Task.WhenAll(seleniumAutomationTask, listenForAuthCodeTask).ConfigureAwait(false); return(authCodeUri); } catch (SocketException ex) { throw new MsalClientException( "selenium_ui_socket_error", "A socket exception occured " + ex.Message + " socket error code " + ex.SocketErrorCode); } } }
private async Task <AuthorizationResult> SeleniumAcquireAuthAsync( Uri authorizationUri, Uri redirectUri) { using (var driver = InitDriverAndGoToUrl(authorizationUri.OriginalString)) using (var listener = new SingleMessageTcpListener(redirectUri.Port)) // starts listening { AuthorizationResult authResult = null; CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(_timeout); var listenForAuthCodeTask = listener.ListenToSingleRequestAndRespondAsync( (uri) => { Trace.WriteLine("Intercepted an auth code url: " + uri.ToString()); authResult = new AuthorizationResult(AuthorizationStatus.Success, uri.ToString()); switch (authResult.Status) { case AuthorizationStatus.Success: return(CloseWindowSuccessHtml); default: return(CloseWindowFailureHtml); } }, cancellationTokenSource.Token); try { // Run the tcp listener and the selenium automation in parallel Task seleniumAutomationTask = Task.Run(() => { _seleniumAutomationLogic(driver); }); await Task.WhenAll(seleniumAutomationTask, listenForAuthCodeTask).ConfigureAwait(false); return(authResult); } catch (Exception ex) when(ex is TaskCanceledException || ex is OperationCanceledException) { var result = new AuthorizationResult(AuthorizationStatus.UserCancel) { ErrorDescription = "Listening for an auth code was cancelled or has timed out.", Error = "system_browser_cancel_or_timeout_exception" }; return(await Task.FromResult(result).ConfigureAwait(false)); } catch (SocketException ex) { var result = new AuthorizationResult(AuthorizationStatus.UnknownError) { ErrorDescription = ex.Message + " socket error code: " + ex.SocketErrorCode, Error = "system_browser_socket_exception" }; return(await Task.FromResult(result).ConfigureAwait(false)); } catch (Exception ex) { var result = new AuthorizationResult(AuthorizationStatus.UnknownError) { ErrorDescription = ex.Message, Error = "system_browser_waiting_exception" }; return(await Task.FromResult(result).ConfigureAwait(false)); } } }