我正在尝试使用 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);
}