Xamarin Android,选择帐户(ADAL /经纪人)后,应用程序崩溃

问题描述 投票:0回答:1

我已经使用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个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.