xamarin - 如何在 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 初始化程序在我开始转到主页之前先完成?MainPage
AppDelegate
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();
}
}
解决方案
推荐阅读
- sql - 执行查询时出现语法错误
- java - 从没有 .remove 的自定义 arraylist 实现中删除项目
- git - Gitlab:如何区分最新和以前的管道提交
- html - 这是在我的交换机上使用 localStorage 的正确方法吗?
- javascript - 是否有从网页调用 python 脚本的功能
- node.js - Firebase 部署仅显示背景灰色,没有错误我怀疑它与 MUITheme 有关
- clojure - 在较大范围的值上评估函数时出现执行错误 (StackOverflowError)
- google-app-engine - 2021 年 1 月 20 日 Java 更新后,应用引擎本地主机无法在 Eclipse 上运行
- amazon-web-services - 在 Amplify 部署的 lambda 函数上运行时未调用 AWS 开发工具包函数
- java - 使用 java servlet 和 apache poi 库下载 xls 文件