Как получить основную пользовательскую информацию в 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
Надеюсь, что поможет