首页 > 解决方案 > 如何在 Xamarin 中实现自动登录?

问题描述

我正在 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's上添加逻辑以OnNavigatedTo在用户保存用户名和密码时自动验证用户身份时。它把我踢出MainPage并回到登录页面。

我的一个疑问是,当我通过导航页面自动登录时,应用程序还没有完成加载。该应用程序OnNavigatedTo将从. (见下文)如何确保 iOS 初始化程序在我开始转到主页之前先完成?MainPageAppDelegate

   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();
        }
    }

标签: xamarinxamarin.formsprismxamarin.auth

解决方案


推荐阅读