コード例 #1
0
        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));
                    }
                }
        }