Проблема со входом в Azure MSAL

Я использую Azure AD B2C и пытаюсь войти, используя имя пользователя и пароль в своем приложении Xamarin. После регистрации я получаю следующую ошибку:

Microsoft.Identity.Client.MsalServiceException: возвращаемый идентификатор пользователя не совпадает с отправленным идентификатором пользователя в Microsoft.Identity.Client.Internal.Requests.RequestBase.SaveTokenResponseToCache ()

Я использую MSAL для входа в систему, и когда мы пытаемся войти в систему через Facebook, он работает отлично.

Я обнаружил еще одну вещь: когда я пытаюсь войти в систему с помощью политики регистрации или входа, я могу войти только с помощью Facebook, но когда я пытаюсь войти только с помощью политики входа, я могу войти только с именем пользователя и паролем, не используя Facebook.

https://user-images.githubusercontent.com/5201635/27732243-fcf1db82-5dad-11e7-9aa7-0796594554a6.jpg


person SONOFGOD    schedule 06.07.2017    source источник
comment
Из сообщения об ошибке кажется, что вы передаете другой идентификатор пользователя для получения токена, сначала проверьте это.   -  person Nan Yu    schedule 07.07.2017


Ответы (2)


В MSAL есть пользовательский кеш, который требует от вас передавать User в ваших AcquireTokenSilentAsync вызовах.

В случае Azure AD B2C записи пользователей в кэше MSAL не сопоставляются один к одному с пользователями B2C, а проецируются на разные используемые политики.

Итак, если у вас есть приложение, которое использует 3 политики для 1 пользователя, пользовательский кеш MSAL будет иметь 3 записи в пользовательском кеше.

С точки зрения кода это означает, что для использования MSAL вам необходимо:

  1. Имейте GetUserByPolicy вспомогательный метод, который получает соответствующую запись в кэше пользователя на основе политики и использует ее для получения пользователя, переданного в ваши вызовы AcquireTokenAsync и AcquireTokenSilentAsync.
  2. Убедитесь, что вы всегда передаете значение Authority в своих AcquireTokenSilentAsync вызовах.

Ошибка «Возвращенный идентификатор пользователя не совпадает с отправленным идентификатором пользователя» обычно возникает из-за того, что любой из этих двух параметров не выполняется правильно.

Из образца Azure AD B2C Xamarin:

AcquireTokenAsync звонок:

AuthenticationResult ar = await App.PCA.AcquireTokenSilentAsync(App.Scopes, GetUserByPolicy(App.PCA.Users, App.PolicySignUpSignIn), App.Authority, false);

AcquireTokenSilentAsync звонок:

AuthenticationResult ar = await App.PCA.AcquireTokenAsync(App.Scopes, GetUserByPolicy(App.PCA.Users, App.PolicySignUpSignIn), App.UiParent);

GetUserByPolicy вспомогательный метод:

private IUser GetUserByPolicy(IEnumerable <IUser> users, string policy)
{
  foreach (var user in users)
  {
    string userIdentifier = Base64UrlDecode(user.Identifier.Split('.')[0]);
    if (userIdentifier.EndsWith(policy.ToLower())) return user;
  }
  return null;
}
person Saca    schedule 07.07.2017

Хорошо, я опаздываю на вечеринку по этому поводу, но в случае, если это поможет кому-то другому, это то, что сработало для меня, когда появилась ошибка «Возвращенный идентификатор пользователя не соответствует отправленному идентификатору пользователя».

Попробуйте добавить это перед AquireLoginAsync / AquireLoginSilentAsync, он очистит все старые объекты USER из кеша.

foreach (var user in ActiveDirectoryB2CAuthenticationClient.Users)
{
    ActiveDirectoryB2CAuthenticationClient.Remove(user);
}
person Iain STIRZAKER    schedule 13.09.2019