【发布时间】:2019-12-10 11:03:14
【问题描述】:
我正在尝试向我的 Xamarin Android 应用程序添加身份验证。我使用以下内容作为指导:https://github.com/azure-samples/active-directory-xamarin-native-v2#integrate-microsoft-identity-and-the-microsoft-graph-into-a-xamarin-forms-app-using-msal
当我尝试从 Visual Studio 在 Android 模拟器中运行该示例时,它运行良好:它会弹出一个登录页面,完成后返回到应用程序。但是,当我尝试在我的应用程序中执行相同操作时,应用程序会中断外部代码(我在 Visual Studio 中看到“应用程序处于中断模式”页面)。
在下面的代码中,MainActivity 中的 OnActivityResult 被调用(我有一个断点),但是控制永远不会返回到 ContinuousScanPage 中 AcquireTokenInteractive 之后的行。
相关部分代码如下(为简洁起见,已删除无关代码):
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
protected async override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
App.ParentWindow = this;
LoadApplication(new App());
}
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(requestCode, resultCode, data);
}
}
App.xaml.cs
public partial class App : Application
{
private string _deviceId;
public string DeviceId { get => _deviceId; internal set => _deviceId = value; }
public IPublicClientApplication PCA { get; set; } = null;
public static object ParentWindow { get; set; }
public string AccessToken { get; set; }
public App()
{
Settings settings = Settings.Get<Settings>();
InitializeComponent();
DeviceId = CrossDeviceInfo.Current.Id;
PCA = PublicClientApplicationBuilder.Create(settings.AuthClientId)
.WithRedirectUri($"msal{settings.AuthClientId}://auth")
.Build();
MainPage = new NavigationPage(new Pages.ContinuousScanPage(CaptureType.MusterIn));
}
}
ContinuousScanPage.xaml.cs
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class ContinuousScanPage : ContentPage
{
private readonly App _app;
public CaptureType CaptureType { get; }
public ContinuousScanPage(CaptureType captureType)
{
CaptureType = captureType;
InitializeComponent();
_app = (App)Application.Current;
}
public static bool IsPageFirstLoad = true;
protected override async void OnAppearing()
{
if (IsPageFirstLoad)
{
IsPageFirstLoad = false;
await SignIn();
BindingContext = this;
}
base.OnAppearing();
}
private async Task SignIn()
{
Settings settings = Settings.Get<Settings>();
AuthenticationResult authResult = null;
IEnumerable<IAccount> accounts = await _app.PCA.GetAccountsAsync();
try
{
IAccount firstAccount = accounts.FirstOrDefault();
authResult = await _app.PCA.AcquireTokenSilent(settings.AuthScope, firstAccount).ExecuteAsync();
await RefreshUserDataAsync(authResult.AccessToken);
}
catch (MsalUiRequiredException)
{
authResult = await _app.PCA.AcquireTokenInteractive(settings.AuthScope)
.WithParentActivityOrWindow(App.ParentWindow)
.ExecuteAsync();
await RefreshUserDataAsync(authResult.AccessToken);
}
}
public async Task RefreshUserDataAsync(string token)
{
_app.AccessToken = token;
}
}
【问题讨论】: