0
votes

I'm using Azure AD B2C with our Xamarin Forms mobile app. However, when testing it never actually logs me in. I sign up for a new account, enter the verification code and password when prompted. When I go enter my details and try to login, it just keeps taking me back to the signin page (where I need to enter my login details....again).

Here are my Azure AD B2C settings.

public const string Tenant = "mytenant.onmicrosoft.com";
public static string ClientId = "my-clientid-for-the-application";
public static string SignUpSignInPolicy = "B2C_1_IfmMobileApp";
public static string PolicyResetPassword = "B2C_1_IfmMobileAppReset ";
public static string[] Scopes = { "" };
public static readonly string CustomRedirectUrl = $"msal{ClientId}://auth";
public static string AuthorityBase = $"https://login.microsoftonline.com/tfp/{Tenant}/";
public static string Authority = $"{AuthorityBase}{SignUpSignInPolicy}";
public static string AuthorityPasswordReset = $"{AuthorityBase}{PolicyResetPassword}";

And here's my signin / signout code.

private async void OnSignInSignOut(object sender, EventArgs e)
{
    try
    {
        IEnumerable<IAccount> accounts = await AuthenticationService.PCA().GetAccountsAsync();

        if (btnSignInSignOut.Text == "Sign in")
        {
            var account = this.GetAccountByPolicy(accounts, ApplicationConstants.SignUpSignInPolicy);
            AuthenticationResult ar =
                        await AuthenticationService.PCA().AcquireTokenAsync(ApplicationConstants.Scopes, account, App.UiParent);
            UpdateUserInfo(ar);
            UpdateSignInState(true);
        }
        else
        {
            foreach (var user in accounts)
            {
                await AuthenticationService.PCA().RemoveAsync(user);
            }
            UpdateSignInState(false);
        }
    }
    catch (MsalClientException ex)
    {
        await DisplayAlert($"MSAL Exception:", ex.ToString(), "Dismiss");
    }
    catch (Exception ex)
    {
        // Checking the exception message 
        // should ONLY be done for B2C
        // reset and not any other error.
        if (ex.Message.Contains("AADB2C90118"))
        {
            OnPasswordReset();
        }
        else
        {
            await DisplayAlert($"Exception:", ex.ToString(), "Dismiss");
        }
    }
}

Update Looking through the Android log I see this error each time I try to log in. I'm assuming that this error is related to my issue.

enter image description here

1

1 Answers

0
votes

I needed to add the following code (as per this example)

For Android in the MainActivity.cs file In OnActivityResult you need to add

AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(requestCode, resultCode, data);

For iOS in AppDelegate.cs you need to add

public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options)
{
    AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(url);
    return true;
}

These changes ensure that the control goes back to MSAL once the interactive portion of the authentication flow has ended.