Как получить основную пользовательскую информацию в Azure Mobile Web App?

У меня есть приложение Xamarin.Forms, и я бы хотел реализовать его функции аутентификации на основе FaceBook и Azure. Сама аутентификация работает, но я не нашел способ получить от пользователя базовую информацию пользователя (имя, адрес электронной почты...)

var user = await DependencyService.Get<IMobileClient>()
            .LoginAsync(MobileServiceAuthenticationProvider.Facebook);

На стороне сервера

 var mobileAppUser = (MobileAppUser)User;
 var facebookCredentials = 
     user.GetIdentityAsync<FacebookCredentials>().Result;

mobileAppUser существует, но facebookCredentials всегда имеет значение null.

Мой бэкэнд на Azure - это новое мобильное веб-приложение, написанное на .net. Все его функции отлично работают, за исключением этого вопроса аутентификации. Я не мог найти правильный способ решить эту проблему на стороне сервера или на стороне клиента. Pls. Заметьте, мой вопрос касается нового способа использования мобильных приложений Azure, а не старого классического.

Вы бы так любезны мне помочь? Любой образец кода или документация приветствуются.

Спасибо заранее!

Ответ 1

Слишком долго для комментария

Если вы проверите реализацию GetIdentityAsync, вы увидите следующее:

  • Он проверяет подлинность пользователя (вы сказали, что пользователь аутентифицирован, поэтому здесь нет проблем).
  • читает "EMA_RuntimeUrl" из config (он не является нулевым, потому что тогда вы получите исключение)
  • проверить, действует ли токен у поставщика или нет. Если нет, это возвращает null.

Я считаю, что это проблема, с которой вы сталкиваетесь. Быстрый поиск по этому вопросу приведет вас к этому вопросу SO.

Итак, вы создали вручную EMA_RuntimeUrl в мобильном приложении на лазурном портале в Свойствах приложения и присвоены адресу шлюза?

Ответ 2

Используя асинхронный вызов, вы должны дождаться завершения операции, и после завершения результат будет доступен. Вы можете сделать это во многом, но в этом случае наиболее естественным будет:

var facebookCredentials = await user.GetIdentityAsync<FacebookCredentials>();
// Here you can use your facebookCredentials variable:

Ответ 3

Ну, я не знаю, может ли это действительно помочь, но я попробую. Насколько я понимаю, вы используете идентификатор asp.net с промежуточным ПО facebook для этого. Я также использую это, но с помощью программного обеспечения google oauth вместо facebook. Если я прав, это должно быть решение

Если это так, когда вы делаете запрос аутентификации с промежуточным программным обеспечением, вы указываете URL-адрес обратного вызова, который будет перенаправлен после успешного процесса аутентификации с вашим провайдером (facebook). Чтобы запросить внешнюю аутентификацию, вы вызываете ChallangeResult с указанным URL-адресом. Когда вы достигли этого обратного вызова, вы можете использовать метод GetExternalLoginInfoAsync() из интерфейса IAuhtnticationManager в качестве первого шага в вашем методе обратного вызова. Чтобы получить экземпляр IAuthenticationManager, вы можете прочитать свойство HttpContext.GetOwinContext().Authentication. После этого вы можете получить всю необходимую информацию о пользователе как IIdentity implementation - GetExternalLoginInfoAsync() возвращает ExternalIdentity instance

Надеюсь, что поможет