Как реализовать автоматический вход в Xamarin? - PullRequest
1 голос
/ 02 июня 2019

Я реализую приложение на Xamarin с функциональностью входа в систему.Я использую Xamarin SecureStorage для хранения моего имени пользователя и пароля в связке ключей.Я использую Prism для перехода между своими страницами.

У меня есть AuthenticationService, который обрабатывает все сохранение и сохранение данных цепочки для ключей с SecureStorage.В моем App.Xaml у меня есть PubSubEvent ниже, который обрабатывает, когда пользователь аутентифицирован или нет.

   var result = await NavigationService.NavigateAsync("/MainPage?title=Welcome");

   if (!result.Success)
   {
        Console.WriteLine("Error {0}", result.Exception);
        logger.Report(result.Exception, new Dictionary<string, string> { { "navigationPath", "/MainPage" } });
                //MainPage = result.CreateErrorPage();
        System.Diagnostics.Debugger.Break();
   }

В моем LoginPageViewModel у меня есть следующая привязка, основанная на моей кнопке входа в систему.

   private async Task OnLoginUserCommandExecutedAsync()
    {
        try
        {
            MyPrivateSession response = new MyPrivateSession();

            //Username/Password text is valid
            response = await _authenticationService.LoginAsync(UserLogin);

            if (!response.IsValidUser)
            {
                await PageDialogService.DisplayAlertAsync("", "Login Unsuccessful - Invalid User Id or Password", "Ok");
            }
        }

        catch (AuthenticationException authEx)
        {
            await PageDialogService.DisplayAlertAsync("Error", authEx.Message, "Ok");
        }

        catch (Exception e)
        {
            Debugger.Break();
            Logger.Log(e.Message, Category.Exception, Priority.Medium);
            await PageDialogService.DisplayAlertAsync("Fatal Error", e.Message, "Ok");
        }
    }

Также в моем LoginPageViewModel у меня есть следующий код в onNavigatedTo, чтобы получить сохраненный логиниз SecureStorage

   public override async void OnNavigatedTo(INavigationParameters parameters)
        {
            // Determine if there is a preferred account to use in cases where the user is logged out and sent directly to the login
            // in this case the AssumedLogin isn't defined.
            if (_authenticationService.AssumedLogin is null)
            {
                await _authenticationService.AssumeUserPriorToLogin();
                if (!(_authenticationService.AssumedLogin is null))
                {

                    UserLogin.Username = _authenticationService.AssumedLogin.Username;
                    UserLogin.Password = _authenticationService.AssumedLogin.Properties["password"];

                    //Segues to VIN Utilities
                    await OnLoginUserCommandExecutedAsync();

                }
            }
        }

В моем AuthenticationService у меня есть это в конце моей логики после доступа к имени пользователя и паролю из SecureStorage

var user = GetCurrentUser();
                    _container.UseInstance(user);

                    //Publish User Authenticated Event
                    _eventAggregator.GetEvent<UserAuthenticatedEvent>().Publish(user);

Моя проблема заключается в том, когда пользователь вручную входит скнопка входа, все работает отлично.Однако, когда я добавляю логику на LoginPageViewModel OnNavigatedTo для автоматической аутентификации пользователя, когда у него есть сохраненные имя пользователя и пароль.Это выбивает меня из MainPage и обратно на страницу входа.

Одно из моих сомнений в том, что когда я делаю автоматический вход через страницу навигации, приложение еще не загружено.Приложение будет регистрировать OnNavigatedTo с MainPage сначала до «Loaded My App» в AppDelegate.(см. ниже) Как я могу убедиться, что инициализаторы iOS завершают работу прежде, чем я начну переходить на главную страницу?

   public override bool FinishedLaunching(UIApplication app, NSDictionary options)
    {
        global::Xamarin.Forms.Forms.Init();

        Rg.Plugins.Popup.Popup.Init();
        SlideOverKit.iOS.SlideOverKit.Init();
        SfCheckBoxRenderer.Init();

        Syncfusion.SfCarousel.XForms.iOS.SfCarouselRenderer.Init();

        Console.WriteLine("Loading My App");
        LoadApplication(new App(new IOSInitializer()));
        Console.WriteLine("Loaded My App");

        return base.FinishedLaunching(app, options);
    }

   public class IOSInitializer : IPlatformInitializer
        {
            public void RegisterTypes(IContainerRegistry containerRegistry)
            {

            }
        }

        private void OnUserAuthenticated(IUser user)
        {
             var result = await NavigationService.NavigateAsync("/MainPage");

        if (!result.Success)
        {
            Console.WriteLine("Error {0}", result.Exception);
            //MainPage = result.CreateErrorPage();
            System.Diagnostics.Debugger.Break();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...