Xamarin.Android 没有表格的 Auth AD B2C。使用 MSAL 还是 AppAuth?

Xamarin.Android auth AD B2C without forms. Use MSAL or AppAuth?

我正在尝试使用 Xamarin.Android 将 AD B2C 与我的移动应用程序一起使用,但不使用表单。

所有关于如何将 AD B2C 与 Xamarin 结合使用的示例都使用了 MSAL,这似乎依赖于使用 Xamarin.Forms。我找不到有关如何将其集成到 Xamarin.Android.

中的示例或文档

我能找到但不符合我需要的例子:
https://github.com/Azure-Samples/active-directory-android-native-appauth-b2c
https://github.com/Azure-Samples/active-directory-b2c-xamarin-native

我阅读并尝试申请的文档,但没有导致成功的身份验证或不适用于我的情况:
https://developer.xamarin.com/guides/xamarin-forms/cloud-services/authentication/azure/
https://developer.xamarin.com/guides/xamarin-forms/cloud-services/authentication/azure-ad-b2c/
https://developer.xamarin.com/guides/xamarin-forms/cloud-services/authentication/azure-ad-b2c-mobile-app/

有没有办法在 Xamarin.Android 中使用 MSAL 而无需使用 Forms,或者我是否必须使用 AppAuth 等其他库?

更新: 我如何尝试使用 MSAL:

public static string ClientId = "MyClientId";
public static string SignUpSignInPolicy = "B2C_1_MyPolicyName";
public static string Authority = "My Authority";
public static string[] Scopes = { ClientId };


private AuthenticationManager()
{
    AuthenticationClient = new PublicClientApplication(ClientId, Authority);
}
    public async Task<AuthenticationResult> AuthenticateAsync()
{
    if (!Initialized)
        throw new InvalidOperationException("Cannot authenticate before AuthenticationManager has been initialized.");

    AuthResult = await AuthenticationClient.AcquireTokenAsync(Scopes,
                                        "",
                                        UiOptions.SelectAccount,
                                        string.Empty,
                                        null,
                                        Authority,
                                        SignUpSignInPolicy);
    return AuthResult;
}
public void Initialize(Activity activity)
{
    if (Initialized)
        return;
    // Load shared prefrences (skipped)
    AuthenticationClient.PlatformParameters = new PlatformParameters(activity);
    Initialized = true;
}

在调用 AquireTokenAsync(..) 时,这会导致 NullPointerException:
"Value cannot be null. Parameter name: clientId"
我使用与示例中相同的参数(并且它们不会崩溃),所有内容都应该被初始化。 此错误的原因之一可能是从 android 调用时 AquireTokenAsync(..) 的参数不同。 (请参阅 PublicClientApplication 的源代码并查找预编译器指令。)
但如果是这种情况,我真的不知道如何构建项目,以便选择 android 的正确版本。

更新 2: 添加了 activity 中应该启动身份验证过程的代码:

public class LoginActivity : Activity
{
    private async void LoginButtonClicked()
    {
        try
        {
            AuthenticationManager.AuthManager.Initialize(this);
            await AuthenticationManager.AuthManager.AuthenticateAsync();
        }
        // Create your application here
        catch (Exception e)
        {
            CreateAndShowDialog(e, Resources.GetString(Resource.String.error_sync));
        }
    }

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

你的 MainActivity.cs 里有这个吗?

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

这是旧的。 但如果有人遇到同样的问题,他犯下和我一样愚蠢的错误的可能性很小:

字段成员按顺序初始化。

我的字段成员之间存在一些依赖关系,并且由于顺序错误,在初始化依赖部分时一个值被评估为 null。