2015-10-26 1 views
10

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

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

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

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

mobileAppUser существует, но facebookCredentials является всегда null.

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

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

Заранее благодарен!

+0

я не знаю, если это может помочь вам, но я чувствую, что могу: HTTP: // WWW. azurefromthetrenches.com/how-to-using-facebook-to-authenticate-with-web-api-2-in-a-native-mobile-application/ или http://blogs.msdn.com/b/carlosfigueira/archive /2012/10/25/getting-user-information-on-azure-mobile-services.aspx или http://stackoverflow.com/questions/25463125/azure-mobile-service-with-facebook-auth-get-user -Информация . Надеюсь, они могут привести вас к решению. Удачи. –

+0

Спасибо моему другу, я прочитал несколько документов, включая эти, но они не помогли решить мою проблему. – Tom

+2

Добро пожаловать. Мне грустно, что они вам не помогли, удачи. –

ответ

0

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

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

Ожидание результата задачи также ожидает завершения. – Tom

+2

Да, вы правы. Еще стоит попробовать. Никогда не знайте детали реализации. –

+0

Большое спасибо, я попробовал это раньше, как и несколько других тривиальных вещей. – Tom

5

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

Если вы проверить выполнение GetIdentityAsync, вы увидите следующее :

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

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

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

+0

Спасибо! Настройки EMA_RuntimeUrl создаются автоматически, когда я создал приложение в Azure. Я ничего не изменил. Его значение - это URL-адрес шлюза, и при открытии этого URL-адреса в браузере он говорит: «Gateway up». – Tom

+0

Итак, я думаю, что эта настройка в порядке, и моя проблема все еще существует. – Tom

+1

Это определенно похоже на проблему конфигурации. Ваш код верен. Поэтому без какой-либо дополнительной информации было бы трудно сказать что-либо. [Это] (https://github.com/Azure/azure-content/blob/master/articles/app-service-mobile/app-service-mobile-dotnet-backend-migrating-from-mobile-services.md# соображения аутентификации) в справке по миграции упоминается «Добавить конечные точки шлюза/signin- * в качестве дополнительного URI перенаправления для каждого провайдера». и имеет _ [AZURE.NOTE] _, который также может применяться для Facebook. – Tamas

0

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

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

Надежда, что помогает

Смежные вопросы