【问题标题】:Xamarin Android, app crashes after selecting account (ADAL/broker)Xamarin Android,选择帐户后应用程序崩溃(ADAL/经纪人)
【发布时间】:2019-11-17 22:56:49
【问题描述】:

一段时间以来,我一直在使用 ADAL 库在我的 Xamarin Android 应用程序中对用户进行身份验证,这一切正常。但是在 Azure 中为后端 API 启用条件访问后,我必须使用代理来完成这项工作。我遵循了 ADAL Wiki (https://github.com/AzureAD/azure-activedirectory-library-for-dotnet/wiki/leveraging-brokers-on-Android-and-iOS) 上的所有说明,但仍然没有找到工作情况。

Xamarin 表单 ADAL 版本:5.2.4

下面是我用来验证用户的代码:

public async Task<AuthenticationResult> Authenticate(string authority, string resource, string clientId, string returnUri)
{
    var context = new AuthenticationContext(authority);
    var param = new PlatformParameters(CrossCurrentActivity.Current.Activity, true, PromptBehavior.SelectAccount);

    if (context.TokenCache.ReadItems().Count() > 0)
        context = new AuthenticationContext(context.TokenCache.ReadItems().First().Authority);

    try
    {
        authResult = await context.AcquireTokenAsync(resource, clientId, new Uri(returnUri), param, userId).ConfigureAwait(false);
        return authResult;
    }
    catch
    {
        return null;
    }
}

在 MainActivity 我添加了以下内容:

protected override void OnResume()
    {
        base.OnResume();

        if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.GetAccounts) == (int)Android.Content.PM.Permission.Granted)
        {
            enablingBrokerSupport();
        }

    }

private void enablingBrokerSupport()
    {
        const string WORK_AND_SCHOOL_TYPE = "com.microsoft.workaccount";

        var accManager = AccountManager.Get(Application.Context);
        Account[] accounts = accManager.GetAccountsByType(WORK_AND_SCHOOL_TYPE);

        Intent intent = AccountManager.NewChooseAccountIntent(null, null, new[] { WORK_AND_SCHOOL_TYPE }, null, null, null, null);
        CrossCurrentActivity.Current.Activity.StartActivityForResult(intent, 999);

        accManager.GetAccountsByType(WORK_AND_SCHOOL_TYPE);
    }


public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
    {
        Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

        base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    }


protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);
        AuthenticationAgentContinuationHelper.SetAuthenticationAgentContinuationEventArgs(requestCode, resultCode, data);
    }

启动应用程序后,它首先提示 GetAccunts 权限(如预期的那样)。授予权限后,它将显示显示我的帐户的帐户选择器。假设它是从经纪人那里获取帐户,那么所有必要的代码都必须按照我的理解正确实施。

我可以在调试控制台中看到以下错误:

[MonoDroid] UNHANDLED EXCEPTION:
[MonoDroid] System.NullReferenceException: Object reference not set to an instance of an object
[MonoDroid] at Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationAgentContinuationHelper.SetAuthenticationAgentContinuationEventArgs (System.Int32 requestCode, Android.App.Result resultCode, Android.Content.Intent data) [0x0001c] in <41e5a54c101e43dca8a2f462dab041fa>:0
[MonoDroid] at ADALTest.Droid.MainActivity.OnActivityResult (System.Int32 requestCode, Android.App.Result resultCode, Android.Content.Intent data) [0x00009] in :0
[MonoDroid] at Android.App.Activity.n_OnActivityResult_IILandroid_content_Intent_ (System.IntPtr jnienv, System.IntPtr native__this, System.Int32 requestCode, System.Int32 native_resultCode, System.IntPtr native_data) [0x00014] in :0
[MonoDroid] at (wrapper dynamic-method) Android.Runtime.DynamicMethodNameCounter.6(intptr,intptr,int,int,intptr)
[DALTes] JNI RegisterNativeMethods: attempt to register 0 native methods for android.runtime.JavaProxyThrowable
[AndroidRuntime] Shutting down VM
[AndroidRuntime] FATAL EXCEPTION: main
[AndroidRuntime] Process: <my_packageid>, PID: 23545
[AndroidRuntime] android.runtime.JavaProxyThrowable: System.NullReferenceException: Object reference not set to an instance of an object
[AndroidRuntime] at Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationAgentContinuationHelper.SetAuthenticationAgentContinuationEventArgs (System.Int32 requestCode, Android.App.Result resultCode, Android.Content.Intent data) [0x0001c] in <41e5a54c101e43dca8a2f462dab041fa>:0
[AndroidRuntime] at ADALTest.Droid.MainActivity.OnActivityResult (System.Int32 requestCode, Android.App.Result resultCode, Android.Content.Intent data) [0x00009] in :0
[AndroidRuntime] at Android.App.Activity.n_OnActivityResult_IILandroid_content_Intent_ (System.IntPtr jnienv, System.IntPtr native__this, System.Int32 requestCode, System.Int32 native_resultCode, System.IntPtr native_data) [0x00014] in :0
[AndroidRuntime] at (wrapper dynamic-method) Android.Runtime.DynamicMethodNameCounter.6(intptr,intptr,int,int,intptr)
[AndroidRuntime] at md5b4882cfeb0ca027f9661a63d1a4e24bc.MainActivity.n_onActivityResult(Native Method)
[AndroidRuntime] at md5b4882cfeb0ca027f9661a63d1a4e24bc.MainActivity.onActivityResult(MainActivity.java:65)
[AndroidRuntime] at android.app.Activity.dispatchActivityResult(Activity.java:7762)
[AndroidRuntime] at android.app.ActivityThread.deliverResults(ActivityThread.java:4603)
[AndroidRuntime] at android.app.ActivityThread.handleSendResult(ActivityThread.java:4652)
[AndroidRuntime] at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
[AndroidRuntime] at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
[AndroidRuntime] at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
[AndroidRuntime] at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1948)
[AndroidRuntime] at android.os.Handler.dispatchMessage(Handler.java:106)
[AndroidRuntime] at android.os.Looper.loop(Looper.java:214)
[AndroidRuntime] at android.app.ActivityThread.main(ActivityThread.java:7050)
[AndroidRuntime] at java.lang.reflect.Method.invoke(Native Method)
[AndroidRuntime] at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
[AndroidRuntime] at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)

感谢任何帮助。

【问题讨论】:

  • 有任何更新吗?您现在解决问题了吗?

标签: xamarin.forms xamarin.android adal


【解决方案1】:

您需要将 try[}catch{} 添加到 OnActivityResult 并检查 wwitch 参数是否为空。因为从你的日志中我看到了

System.NullReferenceException: Object reference not set to an instance of an object [AndroidRuntime] at Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationAgentContinuationHelper.SetAuthenticationAgentContinuationEventArgs (System.Int32 requestCode, Android.App.Result resultCode, Android.Content.Intent data)

显然这个方法有错误

也许这会有所帮助https://github.com/AzureAD/azure-activedirectory-library-for-dotnet/issues/1000

【讨论】:

  • 感谢您的回复,但不幸的是,添加 try/catch 块时没有任何区别。同样的行为,在选择帐户后,应用程序被终止。
猜你喜欢
  • 2016-12-22
  • 1970-01-01
  • 2017-02-13
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多