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。
我正在尝试使用 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。