0

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

有关如何将 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-目录-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-移动应用/

有没有办法在 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 版本。

UPDATE2:从应该启动身份验证过程的活动中添加代码:

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);
    }
4

2 回答 2

0

你的 MainActivity.cs 中有这个吗?

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
    base.OnActivityResult(requestCode, resultCode, data);   
    AuthenticationAgentContinuationHelper
        .SetAuthenticationAgentContinuationEventArgs(requestCode, resultCode, data);
}
于 2017-04-08T21:56:24.907 回答
0

这是旧的。但是,如果有人遇到同样的问题,那么他不太可能像我一样犯下同样愚蠢的错误:

字段成员按顺序初始化。

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

于 2017-08-31T10:49:21.717 回答