如何在Xamarin.forms中存储通过Office365 API验证的状态

本文关键字:Office365 API 验证 状态 存储 Xamarin forms | 更新日期: 2023-09-27 17:59:33

我刚接触Xamarin并使用Office365 API。我试图通过创建一个Xamarin.Forms应用程序来学习,该应用程序在用户通过身份验证后从Office365服务器读取数据。

我一直在遵循一个教程,最后得到了以下登录页面

namespace CMLender.Pages
{
    public partial class Login
    {
        public IPlatformParameters PlatformParameters { get; set; }
        public Login()
        {
            InitializeComponent();
            LoginButton.Clicked += LoginButton_Clicked;
        }
        protected override void OnAppearing()
        {
            App.ClientApplication.PlatformParameters = PlatformParameters;
            base.OnAppearing();
        }
        private async void LoginButton_Clicked(object sender, EventArgs e)
        {
            try
            {
                AuthenticationResult ar = await App.ClientApplication.AcquireTokenAsync(App.Scopes);
            }
            catch (MsalException ex)
            {
                WelcomeText.Text = ex.Message;
            }
            finally
            {
                await Navigation.PushAsync(new MainTab());
            }
        }
    }
}

一旦用户单击登录按钮,他们就会进入Office365用户身份验证页面。一旦他们使用有效的用户名和密码登录,应用程序就会加载MainTab XAML页面。

这就是我的问题开始的地方。我的主选项卡页面如下所示:

namespace CMLender.Pages
{
    public partial class MainTab : ContentPage
    {
        public MainTab()
        {
            InitializeComponent();
            DisplayMessage();
        }
        private async void DisplayMessage()
        {
            try
            {
                AuthenticationResult ar = await App.ClientApplication.AcquireTokenAsync(App.Scopes);
                WelcomeText.Text = $"Welcome {ar.User.Name}";
            }
            catch (MsalException ex)
            {
                WelcomeText.Text = ex.Message;
            }
            finally
            {
                WelcomeTextTwo.Text = "BlaBlaBlab";
            }
        }
    }
}

我希望这个页面将登录的用户名写入标签(它确实这样做了),但首先用户必须重新验证。

我很确定这取决于AcquireTokenAsync任务,但这是我让它工作的唯一方法。如何存储用户已通过身份验证的信息并访问其用户名?

我已经尽了我所能阅读了,但关于这个主题的信息似乎太广泛了。

如何在Xamarin.forms中存储通过Office365 API验证的状态

对于最简单的实现,您可以在App.cs或App.xaml.cs中创建一个公共静态属性,如:

public static AuthenticationResult LoggedInUser { get; set; }

在您的登录页面中,将此添加到您的登录按钮点击事件中:

private async void LoginButton_Clicked(object sender, EventArgs e)
{
       try
       {
            AuthenticationResult ar = await App.ClientApplication.AcquireTokenAsync(App.Scopes);
            App.LoggedInUser = ar;
       }
       catch (MsalException ex)
       {
            WelcomeText.Text = ex.Message;
       }
       finally
       {
            await Navigation.PushAsync(new MainTab());
       }
 }

在您的主页中,从静态属性获取数据,而不是再次调用API:

        private async void DisplayMessage()
        {
            try
            {                    
                WelcomeText.Text = $"Welcome {App.LoggedInUser.User.Name}";
            }
            catch (MsalException ex)
            {
                WelcomeText.Text = ex.Message;
            }
            finally
            {
                WelcomeTextTwo.Text = "BlaBlaBlab";
            }
        }

此外,在您的登录方法中,最终显示主页似乎不正确,因为即使最终发生异常,也会执行。我建议您将await Navigation.PushAsync(new MainTab());移动到try,并在catch中向用户显示异常。