如何在Azure移动Web应用程序中获取基本用户信息?

9
我有一个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始终为空。

我的Azure后端是一个使用.net编写的新移动Web应用程序。除了这个认证问题之外,所有功能都很好。我无法在服务器端或客户端找到解决此问题的正确方法。请注意,我的问题是关于Azure移动应用程序的新方法,而不是旧的经典方法。

您是否可以帮助我?任何示例代码或文档都受到热烈欢迎。

提前致谢!


我不知道它是否可以帮到你,但我觉得它可以: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-info。我希望它们能为你提供解决方案。祝你好运。 - David BS
谢谢我的朋友。我阅读了几篇文档,包括这些文档,但它们没有帮助我解决问题。 - Tom
2
不客气。我很遗憾他们没有帮助到你,祝你好运。 - David BS
@Tom 如果你还没有看过的话,你应该看一下这篇详细文章。从问题中可能有很多东西还不太清楚,比如在服务器端应该使用MobileServiceUser。 - vendettamit
http://stackoverflow.com/questions/32569643/mobile-app-getidentityasync-no-value - Nahum
谢谢Navum,已经检查过了,没有问题。 - Tom
3个回答

5

评论过长

如果您查看GetIdentityAsync的实现,您会看到以下内容:

  • 它检查用户是否已经登录(您说用户已经登录,所以这里没有问题)
  • 从配置中读取"EMA_RuntimeUrl"(如果为null,则会抛出异常)
  • 检查提供程序的令牌是否有效。如果无效,则返回null

我认为这就是您遇到的问题。在此问题上进行快速搜索会将您带到此处的SO问题。

因此,您是否在Azure门户中的应用程序属性中手动创建了EMA_RuntimeUrl,并将其分配给网关地址?


谢谢!在我创建Azure应用程序时,EMA_RuntimeUrl设置会自动生成。我没有更改任何内容。它的值是网关URL,当在浏览器中打开此URL时,会显示“网关已启动”。 - Tom
所以,我认为这个设置是正确的,但我的问题仍然存在。 - Tom
1
这明显是一个配置问题。你的代码是正确的。所以在没有任何额外信息的情况下很难说什么。此迁移指南提到“为每个提供者添加网关的/signin-*端点作为附加重定向URI。”并且有一个[AZURE.NOTE],这也可能适用于Facebook。 - Tamas

0

使用异步调用时,您应该等待操作完成,完成后结果将可用。您可以以多种方式完成此操作,但在这种情况下,最自然的方法是:

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

等待任务结果也等待完成。 - Tom
2
是的,你说得对。仍然值得一试。不知道实现细节。 - g.pickardou
非常感谢,我早些时候尝试过了,就像其他一些琐碎的事情一样。 - Tom
好的,那我会删除这个回答以减少干扰。 - g.pickardou

0

嗯,我不知道这是否真的有帮助,但我会尝试。据我所知,您正在使用带有Facebook中间件的ASP.NET身份验证。我也使用它,但是使用Google OAuth中间件而不是Facebook。如果我没错的话,这应该是解决方案

如果是这样,当您使用中间件进行身份验证请求时,您指定了回调URL,成功完成与提供程序(Facebook)的身份验证过程后将重定向到该URL。要请求外部身份验证,您可以使用指定的URL调用ChallangeResult。当您到达此回调时,您可以在回调方法中作为第一步使用IAuhtnticationManager接口的GetExternalLoginInfoAsync()方法。要获取IAuthenticationManager实例,您可以读取HttpContext.GetOwinContext().Authentication属性。之后,您可以像IIdentity实现一样获取有关用户的所有必要信息-GetExternalLoginInfoAsync()返回ExternalIdentity实例

希望这有所帮助


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接