Я реализую приложение на 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();
}
}